最近在設置某些頁面狀態欄顏色的時候出現了屬性不響應的問題swift
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
複製代碼
依稀記得是直接重寫preferredStatusBarStyle: UIStatusBarStyle這個屬性,而後將info.plist
中的View controller-based status bar appearance
設置爲NO
bash
而後我就開始各類搜索和嘗試,發現若是是自定義的UINavigationController,如今須要重寫另一個屬性app
/// 重寫此方法讓 preferredStatusBarStyle 響應
override var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
複製代碼
爲何要重寫這個東西呢? 由於這兩個方法默認返回值是
nil
也就是當咱們調用setNeedsStatusBarAppearanceUpdate
的時候,系統會調用Container
(容器控制器)的preferredStatusBarStyle
這個方法(window?.rootViewControlle
r的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
override var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
複製代碼
/// 重寫此方法讓 preferredStatusBarStyle 響應
override var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
複製代碼