天天看點

swift 隐藏狀态欄_Swift——preferredStatusBarStyle狀态欄顔色

最近在設定某些頁面狀态欄顔色的時候出現了屬性不響應的問題override var preferredStatusBarStyle: UIStatusBarStyle {        return .lightContent

}

依稀記得是直接重寫preferredStatusBarStyle: UIStatusBarStyle這個屬性,然後将info.plist中的View controller-based status bar appearance設定為NO

swift 隐藏狀态欄_Swift——preferredStatusBarStyle狀态欄顔色

但是這樣設定之後發現還是不響應。

環境相關:swift 4.2 , Xcode 10.0

然後我就開始各種搜尋和嘗試,發現如果是自定義的UINavigationController,現在需要重寫另外一個屬性/// 重寫此方法讓 preferredStatusBarStyle 響應

override var childForStatusBarStyle: UIViewController? {        return self.topViewController

}為什麼要重寫這個東西呢?

因為這兩個方法預設傳回值是nil

也就是當我們調用setNeedsStatusBarAppearanceUpdate的時候,系統會調用Container(容器控制器)的preferredStatusBarStyle這個方法(window?.rootViewController的preferred的方法,一般我們用UINavigationController或者UITabBarController來做Container),也就是根本不會調用子控制器(我們所看到的UIViewcontroller)的preferredStatusBarStyle方法。

這個時候childForStatusBarHidden和childForStatusBarStyle兩個方法就派上用場了。

并且将info.plist中的View controller-based status bar appearance設定為YES

swift 隐藏狀态欄_Swift——preferredStatusBarStyle狀态欄顔色

然後設定狀态欄的屬性就可以響應了!

基本看到的文章都是把另外一個屬性也重寫,關于隐藏的override var childForStatusBarHidden: UIViewController? {       return self.topViewController

}

但是我測試了一下返現不用寫,隐藏屬性可以直接生效override var prefersStatusBarHidden: Bool {        return true

}

看到說如果是有自定義UITabBarController的,需要重寫這個屬性。但是我沒有嘗試,放出來給個提醒好了override var childViewControllerForStatusBarStyle: UIViewController? {    return self.selectedViewController

}

最後我嘗試将info.plist中的View controller-based status bar appearance直接删掉,發現也是可以的,可能這個屬性預設為YES。

總結,敲黑闆啦。如果想設定某個頁面狀态欄為白色

1.重寫狀态欄樣式override var childForStatusBarStyle: UIViewController? {        return self.topViewController

}

2.在自定義的UINavigationController中重寫此方法/// 重寫此方法讓 preferredStatusBarStyle 響應

override var childForStatusBarStyle: UIViewController? {        return self.topViewController

}

作者:Bart_Simpson

連結:https://www.jianshu.com/p/395acc02234b