前言:本次使用的
Swift
版本為4.2
版本,所以代碼上與之前版本的寫法會有不一樣的地方截酷, 但思路都如此兑巾。那我就根據(jù)自己的項目簡單說下解決辦法, 又更好辦法的饰剥, 也請大牛留言探討殊霞, O(∩_∩)O謝謝!
分析:
- 在
iOS9
之前使用UIApplication.shared.statusBarStyle = .lightContent
可以更改狀態(tài)欄的前景顏色汰蓉, 但也改變了全局的绷蹲, 所以在iOS9
之后蘋果推薦使用preferredStatusBarStyle
在對應(yīng)的UIViewController
中靈活改變狀態(tài)欄前景色, 但總會遇到重寫完了不管用的結(jié)果顾孽, 也是讓人很郁悶祝钢。
步驟:
- 首先需要在項目 targets 中的
info.plist
文件中將View controller-based status bar appearance
設(shè)置為NO
; - 如果
UIViewController
是存在于自定義的UINavigationController
中,需要在自定義的UINavigationController
中重寫childForStatusBarHidden
和childForStatusBarStyle
兩個方法:
為什么要重寫這個東西呢若厚?
因為這兩個方法默認返回值是
nil
拦英。也就是當我們調(diào)用
setNeedsStatusBarAppearanceUpdate
的時候,系統(tǒng)會調(diào)用Container
(容器控制器)的preferredStatusBarStyle
這個方法(window?.rootViewController
的preferred
的方法,一般我們用UINavigationController
或者UITabBarController
來做Container
),也就是根本不會調(diào)用子控制器(我們所看到的UIViewcontroller
)的preferredStatusBarStyle
方法。
這個時候childForStatusBarHidden
和childForStatusBarStyle
兩個方法就派上用場了测秸。
// 重寫這兩個方法
override var childForStatusBarHidden: UIViewController? {
return self.topViewController
}
override var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
- 最后在需要改變狀態(tài)欄顏色的
UIViewController
中重寫preferredStatusBarStyle
方法:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}