Swift 修改狀態(tài)欄顏色/樣式(重寫 preferredStatusBarStyle 無效的問題)

默認情況下,頂部狀態(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)欄樣式。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容