设置 UINavigationBar 外观 whenContainedInInstancesOf 到我的视图控制器不起作用

Posted

技术标签:

【中文标题】设置 UINavigationBar 外观 whenContainedInInstancesOf 到我的视图控制器不起作用【英文标题】:Set UINavigationBar appearance whenContainedInInstancesOf to my viewcontroller not working 【发布时间】:2017-07-13 02:53:34 【问题描述】:

我想在一些视图控制器中设置白色 barTintColor 我已设置UINavigationBar.appearance().barTintColor 对于所有默认颜色,但是当我使用外观 whenContainedInInstancesOf 这不是改变我的视图控制器

UINavigationBar.appearance(whenContainedInInstancesOf: [MyViewController.self]).barTintColor = .white

有什么想法吗?我在我的视图控制器中试过这个

self.navigationcontroller.navigationbar.barTintColor = .white

但是当屏幕消失时,我必须将颜色设置回默认值。我不想那样做。我该怎么办?

【问题讨论】:

appearanceWhenContainedIn in Swift的可能重复 @zombie 我试过这个UINavigationBar.appearance(whenContainedInInstancesOf: [MyViewController.self]).barTintColor = .white 但还是不行! 但它说它只适用于 ios 10 所以你测试的是哪个版本 @zombie 我的设备是 10.1.1。 【参考方案1】:

UINavigationBar 包含在 UINavigationController 而不是 UIViewController

话虽如此,您需要创建一个自定义UINavigationController

一个空的类将完成这项工作

class NavigationController: UINavigationController 

那么我们就可以使用它了

UINavigationBar.appearance(whenContainedInInstancesOf: [NavigationController.self]).barTintColor = .white

例子可以在here找到

【讨论】:

我认为这也会改变其他屏幕。哪些屏幕位于第一个屏幕旁边(需要白色导航栏的屏幕)。 如果您的意思是这也会改变UINavigationController 的颜色,那么不会。仅对NavigationController生效 @Oniikal3 顺便问一下你有没有想过或尝试过? 是的,我试过了。和我想的一样展示。它改变了所有正在流动的屏幕。现在我必须在每个视图控制器中设置它。我不想打击它。感谢您的解决方案:) @Oniikal3 这很奇怪,我添加了一个例子来看看。如果您仍有问题,请告诉我【参考方案2】:

@zombie 有正确答案。我刚刚在 UISearchBar 上遇到了这个问题。这是答案的 Swift 3 版本。使用.red 作为本示例的示例UIColor

 let textField = UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self])
 textField.tintColor = .red

 let searchBar = UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self])
 searchBar.setTitleTextAttributes([NSForegroundColorAttributeName: .red], for: .normal)
 searchBar.setTitleTextAttributes([NSForegroundColorAttributeName: .red], for: .disabled)

【讨论】:

【参考方案3】:

斯威夫特 4:

    // For the cursor color
    let textField = UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self])
    textField.tintColor = .lightBlue

    // For the cancel button on search bar
    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.white], for: .normal)
    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.lightText], for: .disabled)

【讨论】:

【参考方案4】:
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UIImagePickerController.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: .normal)

这对我有用!

【讨论】:

以上是关于设置 UINavigationBar 外观 whenContainedInInstancesOf 到我的视图控制器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为所有导航栏 (UINavigationBar) iOS 5.1+ 设置按钮和外观

UINavigationbar 通过外观设置阴影不起作用

如何将透明的“大标题”UINavigationBar 重置为默认外观设置?

设置 UINavigationBar 外观 whenContainedInInstancesOf 到我的视图控制器不起作用

UINavigationBar 外观刷新?

带有 RECurtainViewController 的 UINavigationBar 外观