关于 Swift 中重写 preferredStatusBarStyle 不起作用问题解决方案
程序员文章站
2022-07-14 11:58:04
...
前言:本次使用的
Swift
版本为4.2
版本,所以代码上与之前版本的写法会有不一样的地方, 但思路都如此。那我就根据自己的项目简单说下解决办法, 又更好办法的, 也请大牛留言探讨, O(∩_∩)O谢谢!
分析:
- 在
iOS9
之前使用UIApplication.shared.statusBarStyle = .lightContent
可以更改状态栏的前景颜色, 但也改变了全局的, 所以在iOS9
之后苹果推荐使用preferredStatusBarStyle
在对应的UIViewController
中灵活改变状态栏前景色, 但总会遇到重写完了不管用的结果, 也是让人很郁闷。
步骤:
- 首先需要在项目 targets 中的
info.plist
文件中将View controller-based status bar appearance
设置为NO
; - 如果
UIViewController
是存在于自定义的UINavigationController
中,需要在自定义的UINavigationController
中重写childForStatusBarHidden
和childForStatusBarStyle
两个方法:
为什么要重写这个东西呢?
因为这两个方法默认返回值是
nil
。也就是当我们调用
setNeedsStatusBarAppearanceUpdate
的时候,系统会调用Container
(容器控制器)的preferredStatusBarStyle
这个方法(window?.rootViewController
的preferred
的方法,一般我们用UINavigationController
或者UITabBarController
来做Container
),也就是根本不会调用子控制器(我们所看到的UIViewcontroller
)的preferredStatusBarStyle
方法。
这个时候childForStatusBarHidden
和childForStatusBarStyle
两个方法就派上用场了。
// 重写这两个方法
override var childForStatusBarHidden: UIViewController? {
return self.topViewController
}
override var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
- 最后在需要改变状态栏颜色的
UIViewController
中重写preferredStatusBarStyle
方法:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
上一篇: BOM
下一篇: JavaScript