让preferredStatusBarStyle真的工作(iOS 10以后)

作者:@nixzhu


当你想将Status Bar上的文字改成白色,先(打开还没被GFW屏蔽的VPN)用Google搜索一下,然后开心地在某个UIViewController的子类里写下:

  1. class ViewController: UIViewController {
  2. override var preferredStatusBarStyle: UIStatusBarStyle {
  3. return .lightContent
  4. }
  5. }

你满心欢喜地编译、运行,却发现上面的代码不工作。

原因也很简单,你的VC很可能是被嵌入一个UINavigationController或者UITabBarController中

系统会从windowrootViewController(通常是某个容器VC)开始确认preferredStatusBarStyle

为了让这个确认可以传递下去,你需要子类化UINavigationControllerUITabBarController,并重载:

  1. class NavigationController: UINavigationController {
  2. override var childViewControllerForStatusBarStyle: UIViewController? {
  3. return visibleViewController
  4. }
  5. }
  6. class TabBarController: UITabBarController {
  7. override var childViewControllerForStatusBarStyle: UIViewController? {
  8. return selectedViewController
  9. }
  10. }

这样系统会依据返回的VC的preferredStatusBarStyle来决定Status Bar的Style。当然,你要先使用子类化的UINavigationControllerUITabBarController来做此VC的容器。

通常,这样就不会有问题了。不过,总是有一个例外。

当你present一个VC的时候,被present的VC的preferredStatusBarStyle不会工作(尽管它会是visibleViewController)。你必须在present前设置:

  1. vc.modalPresentationStyle = .overCurrentContext // 如果你用的是自定义转场,modalPresentationStyle会不一样。
  2. vc.modalPresentationCapturesStatusBarAppearance = true

这样“确认工作”才会继续传递下去。

如果有必要,你还应该在合适的时机调用UIViewController的setNeedsStatusBarAppearanceUpdate()来强制更新preferredStatusBarStyle


参考:UIViewController.preferredStatusBarStyle


欢迎转载,但请一定注明出处! https://github.com/nixzhu/dev-blog