我有一个自定义的颜色导航栏,我需要确保状态栏颜色设置为白色。在前iOS 13中,这是很容易做到的,下面是一个UIViewController的代码片段,它很好地完成了任务:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.barStyle = .black
}我在iOS 13中面临的问题是,我现在需要使用NavigationBar的standardAppearance和scrollEdgeAppearance来取消新UIKit中强制的背景透明度。虽然我能够将NavigationBar的文本和背景颜色恢复到我需要的UINavigationBarAppearance(),但它会将我的状态栏颜色恢复为黑色。下面是一个简单的例子,它再现了这个问题:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.standardAppearance = UINavigationBarAppearance() // <--- This is the line that reverts my status bar colour back to black
self.navigationController?.navigationBar.barStyle = .black
}我不确定这是我做错了什么,还是这是一个UIKit错误?
编辑
最后,通过将下面两个属性添加到我的Info.plist文件中,设法解决了这个问题:
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

发布于 2019-10-20 11:07:53
最后,我设法将状态栏样式设置为整个应用程序的白色。在这方面有很多解决方案,但根据我的经验,其中一些解决方案可以非常特定于iOS,也就是说,在iOS 8-12上工作的东西并不意味着它将在iOS 13和Xcode 11上工作。
下面是我的解决方案,它可以在iOS 13上使用Xcode 11 (也可以在运行iOS 12的设备上测试以实现向后兼容性)和iOS= UINavigationBarAppearance()。在Info.plist文件中添加以下两个属性:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>发布于 2019-10-24 02:49:33
暗模式的更改包括一个名为UIView和UIViewController的新属性overrideUserInterfaceStyle。这是表示您需要特定的光/暗样式的首选方法,而不是响应当前暗模式状态的默认行为。
如果您在导航栏或导航控制器上设置了此选项,那么您应该得到您所期望的行为(假设您希望到处都是光线或黑暗)。如果您需要更多的控制,那么子类UINavigationController来改变其行为可能更有意义(例如,通过重写childViewControllerForStatusBarStyle和返回顶层视图控制器)。
发布于 2019-10-20 06:37:23
我很难学会,但是,
“仅仅创建一个UINavigationBarAppearance实例是不够的。”您必须在UINavigationBar实例上实际设置它。
这实际上不是我说的,我在流堆上的一个线程上找到了这个,我找了它,但是找不到它。然而,在上下文中,应该帮助您的内容如下。
//Using this we have to first set up the appearance.
UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
appearance.titleTextAttributes = @{NSFontAttributeName: font};
//Then u have to use it on the navigation bar and if needed on scroll Edge
yourNavigationBar.standardAppearance = appearance;
yourNavigationBar.scrollEdgeAppearance = appearance;
if you want this globally in your navigation bars
UINavigationBar.appearance.standardAppearance = appearance;另一个‘黑客’将是添加到应用程序的所有导航栏将工作的应用程序委托这一点。
在Appdelgate中
func configureGlobalUI() {
UINavigationBar.appearance().barTintColor = .red
}在didFinishLaunching中调用它
https://stackoverflow.com/questions/58468600
复制相似问题