更改 TabView 指示器 SwiftUI
change TabView indicator SwiftUI
有没有办法在 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()
}
}
我尝试了 tabViewStyle(PageIndexViewStyle(backgroundDisplayMode: Color ?))
但无法解决
你需要使用 UIkit
init() {
UIPageControl.appearance().currentPageIndicatorTintColor = .red
UIPageControl.appearance().pageIndicatorTintColor = UIColor.black.withAlphaComponent(0.2)
}
基本上您需要在视图出现时设置全局变量。一种方法如下:
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)
}
}
First create a subview like:
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))
}
Call the subview from main view like:
struct ContentView: View {
var body: some View {
SliderTabView()
}
}
我的输出看起来像:
如果您使用的是来自 UIKit 的 SwiftUI,则可以通过更巧妙的方式来更新 UIPageControl 外观。
// SwiftUI with with UIPageControl
struct MyView: View { ... }
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
}
}
有没有办法在 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()
}
}
我尝试了 tabViewStyle(PageIndexViewStyle(backgroundDisplayMode: Color ?)) 但无法解决
你需要使用 UIkit
init() {
UIPageControl.appearance().currentPageIndicatorTintColor = .red
UIPageControl.appearance().pageIndicatorTintColor = UIColor.black.withAlphaComponent(0.2)
}
基本上您需要在视图出现时设置全局变量。一种方法如下:
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)
}
}
First create a subview like:
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))
}
Call the subview from main view like:
struct ContentView: View {
var body: some View {
SliderTabView()
}
}
我的输出看起来像:
如果您使用的是来自 UIKit 的 SwiftUI,则可以通过更巧妙的方式来更新 UIPageControl 外观。
// SwiftUI with with UIPageControl
struct MyView: View { ... }
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
}
}