non*_*ing 8 uinavigationbar uikit ios swift ios13
我有一个自定义颜色导航栏,我需要确保状态栏颜色设置为白色。在 iOS 13 之前,这很容易做到,这里是 UIViewController 的代码片段,它做得很好:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.barStyle = .black
}
Run Code Online (Sandbox Code Playgroud)
我在 iOS 13 中面临的问题是我现在需要使用 NavigationBar 的 standardAppearance 和 scrollEdgeAppearance 来撤消新 UIKit 中的强制背景透明度。虽然我可以使用 UINavigationBarAppearance() 将 NavigationBar 的文本和背景颜色设置为我需要的颜色,但它会将我的状态栏颜色恢复为黑色。这是一个重现问题的简单示例:
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
}
Run Code Online (Sandbox Code Playgroud)
我不确定这是我做错了什么还是这是一个 UIKit 错误?
编辑
最后通过将以下两个属性添加到我的 Info.plist 文件来解决问题:
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
Run Code Online (Sandbox Code Playgroud)
小智 6
暗模式的更改包括一个名为 overrideUserInterfaceStyle 的新 UIView 和 UIViewController 属性。这是表明您想要特定明/暗样式而不是我们响应当前暗模式状态的默认行为的首选方式。
如果你在你的导航栏或导航控制器上设置它,那么你应该得到你期望的行为(假设你想要到处都是亮或暗)。如果您需要更多控制,那么将 UINavigationController 子类化以更改其行为可能更有意义(例如,通过覆盖 -childViewControllerForStatusBarStyle 并返回顶视图控制器)。
我最终成功地将整个应用程序的状态栏样式设置为白色。SO 有很多解决方案,但根据我的经验,其中一些可能非常针对 iOS,即在 iOS 8-12 上适用的解决方案并不一定意味着它可以在带有Xcode 11的iOS 13上工作。
这是我的解决方案,适用于带有Xcode 11的iOS 13(还在运行iOS 12的设备上进行了测试以实现向后兼容性)和UINavigationBar.appearance().standardAppearance = UINavigationBarAppearance()。在 Info.plist 文件中添加以下两个属性:
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2500 次 |
| 最近记录: |