默認(rèn)情況下单旁,頂部狀態(tài)欄(statusBar)為 default 樣式(即黑色文字和圖標(biāo))拦赠,但我們有時(shí)會(huì)希望可以修改狀態(tài)欄的樣巍沙,這樣,我們的應(yīng)用看起來(lái)會(huì)更加協(xié)調(diào)荷鼠。
我們針對(duì)不同的情況句携,所做的處理也不盡相同,這些情況包括:
沒(méi)有使用導(dǎo)航控制器的情況
使用了系統(tǒng)導(dǎo)航控制器的情況
使用了自定義導(dǎo)航控制器的情況
前提條件:
plist文件里面要設(shè)置 View controller-based status bar appearance為YES(系統(tǒng)默認(rèn)為YES允乐,不要誤設(shè)為 NO)矮嫉。
沒(méi)有使用導(dǎo)航控制器的情況
如果沒(méi)有使用導(dǎo)航控制器 UINavigationController削咆,那么我們只需要在 UIViewController 中重寫(xiě) preferredStatusBarStyle 可讀屬性,在具體實(shí)現(xiàn)中返回希望使用的樣式即可蠢笋。然后在需要更新?tīng)顟B(tài)欄樣式的時(shí)候拨齐,調(diào)用 setNeedsStatusBarAppearanceUpdate() 方法來(lái)觸發(fā)它。
例如:將系統(tǒng)默認(rèn)的狀態(tài)欄樣式修改為 lightContent昨寞,我們可以在控制器的 viewDidLoad() 方法中去觸發(fā)它:
override var preferredStatusBarStyle: UIStatusBarStyle {
? return .lightContent
}
override func viewDidLoad() {
? super.viewDidLoad()
? // 主動(dòng)觸發(fā)來(lái)更新?tīng)顟B(tài)欄樣式? ?
? setNeedsStatusBarAppearanceUpdate()
}
使用了系統(tǒng)導(dǎo)航控制器的情況
如果我們使用了系統(tǒng)導(dǎo)航控制器 UINavigationController瞻惋,那么即使在 UIViewController 中重寫(xiě)了 preferredStatusBarStyle 可讀屬性,并且主動(dòng)去調(diào)用了 setNeedsStatusBarAppearanceUpdate() 方法援岩,preferredStatusBarStyle 屬性也不會(huì)被調(diào)用歼狼,因?yàn)榇藭r(shí)狀態(tài)欄的樣式是根據(jù)導(dǎo)航欄的樣式進(jìn)行自動(dòng)變換的。
如果我們想要修改狀態(tài)欄的樣式窄俏,我們就要主動(dòng)去修改導(dǎo)航欄的樣式蹂匹。當(dāng)然,這種情況下我們就不需要去重寫(xiě) preferredStatusBarStyle 屬性了凹蜈。
例如:修改導(dǎo)航欄樣式為 .black限寞,導(dǎo)航欄文字將為白色,狀態(tài)欄樣式將自動(dòng)變?yōu)?.lightContent:
override func viewDidLoad() {
? super.viewDidLoad()
? navigationController?.navigationBar.barStyle = .black
}
使用了自定義導(dǎo)航控制器的情況
如果我們使用了自定義導(dǎo)航控制器仰坦,那么即使我們做了如上述第2種情況的準(zhǔn)備工作履植,狀態(tài)欄樣式也不能跟隨導(dǎo)航欄樣式進(jìn)行改變。這種情況下悄晃,我們要在自定義的導(dǎo)航控制器中重寫(xiě) childForStatusBarStyle 可讀屬性玫霎,并返回 topViewController。如下:
class CusstomNavigationController: UINavigationController {
? override var childForStatusBarStyle: UIViewController? {
? ? return topViewController
? }
}
在想要改變狀態(tài)欄樣式的控制器中妈橄,只需要重寫(xiě) preferredStatusBarStyle 可讀屬性即可實(shí)現(xiàn)狀態(tài)欄樣式改變:
override var preferredStatusBarStyle: UIStatusBarStyle {
? return .lightContent
}
這種情況不用修改導(dǎo)航欄樣式(不用寫(xiě) navigationController?.navigationBar.barStyle = .black)庶近,也不用主動(dòng)去調(diào)用 setNeedsStatusBarAppearanceUpdate() 方法,因?yàn)樽远x的 CusstomNavigationController 導(dǎo)航控制器中重寫(xiě)的 childForStatusBarStyle 屬性中返回了 topViewController 就是為了告訴系統(tǒng)去調(diào)用棧頂?shù)目刂破鳎╰opViewController)里邊的 preferredStatusBarStyle 屬性值來(lái)更新?tīng)顟B(tài)欄樣式眷蚓。