一纹份、過去修改狀態(tài)欄樣式是通過添加 Info.plist 屬性來修改:
1蔓涧、在Info.plist
中設(shè)置 View controller-based status bar appearance
為 NO
2元暴、在需要修改的控制器中
override func viewDidLoad() {
super.viewDidLoad()
UIApplication.shared.statusBarStyle = .lightContent
}
如果需要在全部View
中都改變樣式茉盏,可以寫在父類的相關(guān)方法中鸠姨,或者寫到AppDelegate.swift
中讶迁。
二巍糯、現(xiàn)在修改狀態(tài)欄的樣式可以使用以下方法祟峦,更加簡便宅楞,不用配置Info.plist
屬性:
/// 狀態(tài)欄樣式
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
/// 狀態(tài)欄是否隱藏
override var prefersStatusBarHidden: Bool {
return false
}
/// 狀態(tài)欄的隱藏與顯示動畫樣式
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
但是如果控制器包裝了一個
UINavigationController
咱筛,就會發(fā)現(xiàn)即使重寫了preferredStatusBarStyle
屬性迅箩,狀態(tài)欄樣式也沒有做任何的改變饲趋。
這是需要重寫
UINavigationController
的以下2個方法奕塑,來讓系統(tǒng)調(diào)用當(dāng)前控制器的preferredStatusBarStyle
屬性龄砰。
extension UINavigationController {
open override var childViewControllerForStatusBarStyle: UIViewController? {
return viewControllers.last
}
open override var childViewControllerForStatusBarHidden: UIViewController? {
return viewControllers.last
}
}
如果應(yīng)用的第一頁面就需要修改狀態(tài)欄樣式式镐,建議在
Deployment Info -> Status Bar Style
中預(yù)先設(shè)置好娘汞,以免開啟應(yīng)用時有過渡的效果你弦。
三、關(guān)于動態(tài)修改狀態(tài)欄
有時我們需要動態(tài)的修改狀態(tài)欄是否隱藏 或者 更改狀態(tài)欄樣式旷偿。這時狸捅,可以自定義變量來記錄狀態(tài)尘喝。
例如:
var isStatusBarHidden = false {
didSet {
/// 這里包裝動畫使得 preferredStatusBarUpdateAnimation 能體現(xiàn)效果
UIView.animate(withDuration: 0.3) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
/// 狀態(tài)欄是否隱藏
override var prefersStatusBarHidden: Bool {
return isStatusBarHidden
}
/// 狀態(tài)欄的隱藏與顯示動畫樣式
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
return .slide
}
/// 隱藏或顯示狀態(tài)欄
@IBAction func changeStatusBar(_ sender: UIButton) {
isStatusBarHidden = !isStatusBarHidden
}
?? 當(dāng)你present
一個VC
的時候置吓,被present
的VC
的preferredStatusBarStyle
不會工作,你必須在present
前設(shè)置:
vc.modalPresentationCapturesStatusBarAppearance = true