iOS Swift 状态栏的颜色更改(深色背景/浅色背景), 修改状态栏无效

解决问题: 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. 非常重要: 否则第二步的代码不会被调用.

设置默认的屏幕StatusBar显示状态

Step 2: 在要控制页面StatusBar显示样式的VC 添加如下代码:

设置本页面为的statusBar为lightContent

拓展知识: 解决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即可.)

重写preferredStatusBarStyle即可.

如果需要强制更新本页面的状态栏. 可以在调用setNeedsStatusBarAppearanceUpdate() 来触发. 一般我放倒viewWillAppear中去触发. 


Case 2:使用了系统的导航栏控制器(navigationController)

如果使用了导航栏. 不论是自定义导航栏或者是系统导航栏. 那么重写preferredStatusBarStyle就不会被调用了. 主动调用setNeedsStatusBarAppearanceUpdate()也不会起作用. 因为这个时候, 状态栏的颜色由状态栏一体控制了. 

因此也不必重写preferredStatusBarStyle, 或者调用了. setNeedsStatusBarAppearanceUpdate(). 直接将状态栏的barStyle设置为.black(我需要浅色文字, 你可以根据自己的需要设置/ .default / .blackTranslucent / .blackOpaque). 


设置barStyle用来更改StatusBar样式


Case 3:使用了自定义的导航栏控制器

如果使用了自定义的导航栏样式. 那么上述两种控制方式都将失效. 我们需要使用新的方法来控制. 在自定义的导航栏控制器中重写:childForStatusBarStyle. 


重写childForStatusBarStyle.

然后. 在想要改变状态栏的VC中. 重写preferredStatusBarStyle即可. 就能控制状态栏的颜色了.

这种情况不用修改导航栏样式(不用写 self.navigationController?.navigationBar.barStyle = .black),也不用主动去调用 setNeedsStatusBarAppearanceUpdate() 方法,因为自定义的 BSMobileFillViewController 导航控制器中重写的 childForStatusBarStyle 属性中返回了 topViewController 就是为了告诉系统去调用栈顶的控制器(topViewController)里边的 preferredStatusBarStyle 属性值来更新状态栏样式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容