Swift——preferredStatusBarStyle狀態欄顏色

最近在設置某些頁面狀態欄顏色的時候出現了屬性不響應的問題swift

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
複製代碼

依稀記得是直接重寫preferredStatusBarStyle: UIStatusBarStyle這個屬性,而後將info.plist中的View controller-based status bar appearance設置爲NO bash

可是這樣設置以後發現仍是不響應。

環境相關:swift 4.2 , Xcode 10.0

而後我就開始各類搜索和嘗試,發現若是是自定義的UINavigationController,如今須要重寫另一個屬性app

/// 重寫此方法讓 preferredStatusBarStyle 響應
    override var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }
複製代碼

爲何要重寫這個東西呢? 由於這兩個方法默認返回值是nil 也就是當咱們調用setNeedsStatusBarAppearanceUpdate的時候,系統會調用Container(容器控制器)的preferredStatusBarStyle這個方法(window?.rootViewController的preferred的方法,通常咱們用UINavigationController或者UITabBarController來作Container),也就是根本不會調用子控制器(咱們所看到的UIViewcontroller)的preferredStatusBarStyle方法。 這個時候childForStatusBarHidden和childForStatusBarStyle兩個方法就派上用場了。ide

而且將info.plist中的View controller-based status bar appearance設置爲YES 測試

而後設置狀態欄的屬性就能夠響應了!

基本看到的文章都是把另一個屬性也重寫,關於隱藏的ui

override var childForStatusBarHidden: UIViewController? {
       return self.topViewController
   }
複製代碼

可是我測試了一下返現不用寫,隱藏屬性能夠直接生效spa

override var prefersStatusBarHidden: Bool {
        return true
    }
複製代碼

看到說若是是有自定義UITabBarController的,須要重寫這個屬性。可是我沒有嘗試,放出來給個提醒好了code

override var childViewControllerForStatusBarStyle: UIViewController? {
    return self.selectedViewController
}
複製代碼

最後我嘗試將info.plist中的View controller-based status bar appearance直接刪掉,發現也是能夠的,可能這個屬性默認爲YES。cdn

總結,敲黑板啦。若是想設置某個頁面狀態欄爲白色

1.重寫狀態欄樣式

override var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }
複製代碼

2.在自定義的UINavigationController中重寫此方法

/// 重寫此方法讓 preferredStatusBarStyle 響應
    override var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }
複製代碼
相關文章
相關標籤/搜索