更改 TabView 指示器 SwiftUI

Pin*_*ngo 11 swift swiftui xcode12

在此处输入图片说明

有没有办法在 swiftUI 中更改 tabView 指示器颜色?

这是我的代码

struct OnBoarding: View {
    var body: some View {
        
        TabView {
            ForEach(0 ..< 3) { item in
                VStack {

                    Image("discover")
                        .resizable()
                        .scaledToFit()
                    
                }
            }
        }

        .tabViewStyle(PageIndexViewStyle(backgroundDisplayMode: Color ?))
        
    }
}

struct OnBoarding_Previews: PreviewProvider {
    static var previews: some View {
        OnBoarding()
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过 tabViewStyle(PageIndexViewStyle(backgroundDisplayMode: Color ?)) 但无法解决它

Ach*_*raf 21

你需要使用 UIkit

 init() {
    UIPageControl.appearance().currentPageIndicatorTintColor = .red
    UIPageControl.appearance().pageIndicatorTintColor = UIColor.black.withAlphaComponent(0.2)
    }
Run Code Online (Sandbox Code Playgroud)

  • 这个初始化应该放在哪里?它会影响应用程序中的其他分页样式吗? (5认同)
  • 这会影响应用程序中的所有屏幕。如果您只想在一个视图上更改它,那么您应该将这些行放在 onAppear 中,然后在离开视图时使用 onDisappear 撤消更改。(使用 nil 作为两者的值似乎将它们重置为默认值) (5认同)

Ruf*_*rza 8

基本上,您需要在视图出现时设置全局变量。一种方法如下:

import SwiftUI

struct OnboardingView: View {
  
  var pages: [Page]
  
  var body: some View {
  
    TabView {
      ForEach(pages) { page in
        // Your component view
      }
    }
    .tabViewStyle(PageTabViewStyle())
    .onAppear {
      setupAppearance()
    }
  }
  
  func setupAppearance() {
    UIPageControl.appearance().currentPageIndicatorTintColor = .black
    UIPageControl.appearance().pageIndicatorTintColor = UIColor.black.withAlphaComponent(0.2)
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 它现在不起作用,但 @Achraf 的版本在 init() 中起作用。我不知道为什么... (2认同)

Mah*_*man 6

首先创建一个子视图,例如:

struct SliderTabView: View {
init() {
          UIPageControl.appearance().currentPageIndicatorTintColor = .red
          UIPageControl.appearance().pageIndicatorTintColor = UIColor.red.withAlphaComponent(0.2)
       }
var body: some View {
    TabView{
        ForEach(players){ player in
            //Slider content here ...
        }
    }.tabViewStyle(PageTabViewStyle(indexDisplayMode: .always))
}
Run Code Online (Sandbox Code Playgroud)

从主视图调用子视图,如下所示:

    struct ContentView: View {
          var body: some View {
                                 SliderTabView()
                              }
                             }
Run Code Online (Sandbox Code Playgroud)

输出看起来像我: 在此输入图像描述


And*_*wPo 5

如果您使用 UIKit 中的 SwiftUI,则有一种更微妙的方法来更新 UIPageControl 外观。

// SwiftUI with with UIPageControl
struct MyView: View { ... }
Run Code Online (Sandbox Code Playgroud)
import SwiftUI
import UIKit

final class MyViewContainerController: UIHostingController<MyView> {
    init() {
        let view = MyView()
        super.init(rootView: view)
    }

    @available(*, unavailable)
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let containerTypes = [MyViewContainerController.self]
        let appearance = UIPageControl.appearance(whenContainedInInstancesOf: containerTypes)
        appearance.currentPageIndicatorTintColor = .systemBlue
        appearance.pageIndicatorTintColor = .systemIndigo
    }
}
Run Code Online (Sandbox Code Playgroud)