解决问题: Setter for 'statusBarStyle' was deprecated in iOS 9.0: Use -[UIViewController preferredStatusBarStyle]
iOS9.0以后已经不在建议直接设置preferredStatusBarStyle的值的方式控制状态栏颜色.
解决办法:
Step 1: 在info.plist 中增加 View controller-based status bar appearance , 并且设置为YES. 非常重要: 否则第二步的代码不会被调用.
Step 2: 在要控制页面StatusBar显示样式的VC 添加如下代码:
拓展知识: 解决preferredStatusBarStyle 无效的问题
关于这个问题. 需要分如下三种情况考虑:
Case 1: 没有使用导航栏控制器(纯VC.没有导航栏.)
Case 2:使用了系统的导航栏控制器(navigationController)
Case 3:使用了自定义的导航栏控制器;
前提: 在info.plist 中增加 View controller-based status bar appearance , 并且设置为YES. 请不要误设置为NO
Case 1: 没有使用导航栏控制器(纯VC.没有导航栏.)
在需要控制状态栏的VC中加入如下代码: (我的状态栏是深色背景,因此我希望状态栏显示白色文字.lightContent. 如果你需要黑色文字. return .default即可.)
如果需要强制更新本页面的状态栏. 可以在调用setNeedsStatusBarAppearanceUpdate() 来触发. 一般我放倒viewWillAppear中去触发.
Case 2:使用了系统的导航栏控制器(navigationController)
如果使用了导航栏. 不论是自定义导航栏或者是系统导航栏. 那么重写preferredStatusBarStyle就不会被调用了. 主动调用setNeedsStatusBarAppearanceUpdate()也不会起作用. 因为这个时候, 状态栏的颜色由状态栏一体控制了.
因此也不必重写preferredStatusBarStyle, 或者调用了. setNeedsStatusBarAppearanceUpdate(). 直接将状态栏的barStyle设置为.black(我需要浅色文字, 你可以根据自己的需要设置/ .default / .blackTranslucent / .blackOpaque).
Case 3:使用了自定义的导航栏控制器
如果使用了自定义的导航栏样式. 那么上述两种控制方式都将失效. 我们需要使用新的方法来控制. 在自定义的导航栏控制器中重写:childForStatusBarStyle.
然后. 在想要改变状态栏的VC中. 重写preferredStatusBarStyle即可. 就能控制状态栏的颜色了.
这种情况不用修改导航栏样式(不用写 self.navigationController?.navigationBar.barStyle = .black),也不用主动去调用 setNeedsStatusBarAppearanceUpdate() 方法,因为自定义的 BSMobileFillViewController 导航控制器中重写的 childForStatusBarStyle 属性中返回了 topViewController 就是为了告诉系统去调用栈顶的控制器(topViewController)里边的 preferredStatusBarStyle 属性值来更新状态栏样式。