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
    }
复制代码