先看例子
1、沒有導航欄的情況
class ViewController: UIViewController {
var style: UIStatusBarStyle = .default
override var preferredStatusBarStyle: UIStatusBarStyle
{
print("無導航欄就會進來了。")
return self.style
}
var changeBtn: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .purple
let btn = UIButton.init(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
btn.backgroundColor = .gray
self.changeBtn = btn
btn.setTitle("hit me", for: .normal)
btn.addTarget(self, action: #selector(click), for: .touchUpInside)
self.view.addSubview(btn)
}
@objc func click() {
// 1、沒有導航欄的情況
if self.style == .lightContent {
self.style = .default
}else {
self.style = .lightContent
}
setNeedsStatusBarAppearanceUpdate() // 在需要更新的時候調用 setNeedsStatusBarAppearanceUpdate() 方法來觸發它。
}
}
此時會打印
無導航欄就會進來了。
2、有導航欄的情況
如果我們使用了導航控制器 UINavigationController, 且它的 navigationBar 沒有被隱藏,那麼會發現即使重寫 preferredStatusBarStyle 方法,這個方法也不會被調用。因爲此時狀態欄的樣式是根據導航欄的樣式來自動變換的。
@objc func click() {
// 2、有導航欄的情況
if let navigationBar = self.navigationController?.navigationBar {
if navigationBar.barStyle == .default {
navigationBar.barStyle = .black
} else {
navigationBar.barStyle = .default
}
}
}
此時不會打印
無導航欄就會進來了。
注意:上面的條件都是在info.pllist 設置
<key>UIViewControllerBasedStatusBarAppearance</key> <true/>
或者不設置的情況下(跟true是一樣效果)
總結:
一、不會觸發的preferredStatusBarStyle
情況:
1、<key>UIViewControllerBasedStatusBarAppearance</key>
設置爲false
2、有導航欄且navigationBar沒有被隱藏
二、<key>UIViewControllerBasedStatusBarAppearance</key>
設置爲false:
1、preferredStatusBarStyle
不會被觸發
2、navigationBar.barStyle = .black
不起作用
3、application.statusBarStyle = .lightContent
會起作用
4、在 General -> Deployment Info 中,將 Status Bar Style 設置成 Light會起作用(3優先4)
三、<key>UIViewControllerBasedStatusBarAppearance</key>
設置爲true:
與總結二反之