Swift 狀態(tài)欄 字體顏色修改

默認情況下,頂部狀態(tài)欄(statusBar)為 default 樣式(即黑色文字和圖標),不過很多場景下UI設計會要求文字展示為白色,這樣,我們的應用看起來會更加協(xié)調(diào)。

重寫 preferredStatusBarStyle 方法為什么有的地方生效,有的地方卻不生效呢 ?
接下來我們做一下簡單的分析和介紹 :

首先,控制器分為以下幾種情況:

  • 沒有使用導航控制器的情況
  • 使用了系統(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 func viewDidLoad() {
  super.viewDidLoad()
  // 主動觸發(fā)來更新狀態(tài)欄樣式   
  setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
  return .lightContent
}

二、使用了系統(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 {
  //重寫  childForStatusBarStyle 方法
  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)欄樣式。

參考鏈接:http://www.itdecent.cn/p/7e77425b3cf0


文章持續(xù)更新中、希望對各位有所幫助、有問題可留言 大家共同學習.

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

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