默認情況下,頂部狀態(tài)欄(statusBar)為 default 樣式(即黑色文字和圖標),但我們有時會希望可以修改狀態(tài)欄的樣,這樣,我們的應用看起來會更加協(xié)調(diào)。
我們針對不同的情況,所做的處理也不盡相同,這些情況包括:
沒有使用導航控制器的情況
使用了系統(tǒng)導航控制器的情況
使用了自定義導航控制器的情況
前提條件:
plist文件里面要設置 View controller-based status bar appearance為YES(系統(tǒng)默認為YES,不要誤設為 NO)。
沒有使用導航控制器的情況
如果沒有使用導航控制器 UINavigationController,那么我們只需要在 UIViewController 中重寫 preferredStatusBarStyle 可讀屬性,在具體實現(xiàn)中返回希望使用的樣式即可。然后在需要更新狀態(tài)欄樣式的時候,調(diào)用 setNeedsStatusBarAppearanceUpdate() 方法來觸發(fā)它。
例如:將系統(tǒng)默認的狀態(tài)欄樣式修改為 lightContent,我們可以在控制器的 viewDidLoad() 方法中去觸發(fā)它:
override var preferredStatusBarStyle: UIStatusBarStyle {
? return .lightContent
}
override func viewDidLoad() {
? super.viewDidLoad()
? // 主動觸發(fā)來更新狀態(tài)欄樣式? ?
? setNeedsStatusBarAppearanceUpdate()
}
使用了系統(tǒng)導航控制器的情況
如果我們使用了系統(tǒng)導航控制器 UINavigationController,那么即使在 UIViewController 中重寫了 preferredStatusBarStyle 可讀屬性,并且主動去調(diào)用了 setNeedsStatusBarAppearanceUpdate() 方法,preferredStatusBarStyle 屬性也不會被調(diào)用,因為此時狀態(tài)欄的樣式是根據(jù)導航欄的樣式進行自動變換的。
如果我們想要修改狀態(tài)欄的樣式,我們就要主動去修改導航欄的樣式。當然,這種情況下我們就不需要去重寫 preferredStatusBarStyle 屬性了。
例如:修改導航欄樣式為 .black,導航欄文字將為白色,狀態(tài)欄樣式將自動變?yōu)?.lightContent:
override func viewDidLoad() {
? super.viewDidLoad()
? navigationController?.navigationBar.barStyle = .black
}
使用了自定義導航控制器的情況
如果我們使用了自定義導航控制器,那么即使我們做了如上述第2種情況的準備工作,狀態(tài)欄樣式也不能跟隨導航欄樣式進行改變。這種情況下,我們要在自定義的導航控制器中重寫 childForStatusBarStyle 可讀屬性,并返回 topViewController。如下:
class CusstomNavigationController: UINavigationController {
? override var childForStatusBarStyle: UIViewController? {
? ? return topViewController
? }
}
在想要改變狀態(tài)欄樣式的控制器中,只需要重寫 preferredStatusBarStyle 可讀屬性即可實現(xiàn)狀態(tài)欄樣式改變:
override var preferredStatusBarStyle: UIStatusBarStyle {
? return .lightContent
}
這種情況不用修改導航欄樣式(不用寫 navigationController?.navigationBar.barStyle = .black),也不用主動去調(diào)用 setNeedsStatusBarAppearanceUpdate() 方法,因為自定義的 CusstomNavigationController 導航控制器中重寫的 childForStatusBarStyle 屬性中返回了 topViewController 就是為了告訴系統(tǒng)去調(diào)用棧頂?shù)目刂破鳎╰opViewController)里邊的 preferredStatusBarStyle 屬性值來更新狀態(tài)欄樣式。