最近在設定某些頁面狀态欄顔色的時候出現了屬性不響應的問題override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent
}
依稀記得是直接重寫preferredStatusBarStyle: UIStatusBarStyle這個屬性,然後将info.plist中的View controller-based status bar appearance設定為NO
但是這樣設定之後發現還是不響應。
環境相關: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
然後設定狀态欄的屬性就可以響應了!
基本看到的文章都是把另外一個屬性也重寫,關于隐藏的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