一篇搞定状态栏颜色变化

状态栏分为前后两部分:
前景部分:就是指的显示电池、时间等部分;
背景部分:就是显示黑色或者图片的背景部分;
(参考自http://my.oschina.net/shede333/blog/304560 )本文说的状态栏颜色变化都是指前景部分,也是常需要处理的情况。背景部分的改变参考该博客就可以了。

1. 更改启动图上状态栏颜色

如果在General里面设置

1.png

设置为Light就可以将状态栏前景部分设置为白色,下面的Hide status bar勾选后可以隐藏状态栏。
如果在Info.plist里面设置Status bar style项

2.png

效果一样,两种只要设置一个,另一个就会改变,不存在优先级问题。

2. 统一设置app所有控制器view的状态栏颜色

需要了解View controller-based status bar appearance属性:在info.plist文件中,如果将该属性设为YES,则控制器对状态栏的设置优先级最高,可以在控制器中对状态栏颜色进行单独修改。如果设置为NO的话,则以启动图设置为准,即app内部所有控制器view上状态栏前景部分颜色和启动图上保持一致,但是还可以通过UIApplication管理。

也就是说,统一设置状态栏颜色,如果想跟启动图上一样的话,直接将该属性设置为NO就行了。如果不想跟启动图一致,可以通过UIApplication设置。但是iOS9以后已经不建议使用UIApplication管理状态栏了,在此不做多的讲解。

另外,如果在有导航控制器作为根控制器的情况下,可以通过以下设置:self.navigationController.navigationBar.barStyle = UIBarStyleBlack将导航条背景样式设为黑色,所有状态栏的前景部分颜色就自动变为白色了。

3. 单独设置某个控制器View的状态栏颜色(没有被导航控制器包裹)

首先要将View controller-based status bar appearance设为YES,然后在该控制器内添加:

-(UIStatusBarStyle)preferredStatusBarStyle
{
     return UIStatusBarStyleLightContent;
}

4. 单独设置某个控制器View的状态栏颜色(被导航控制器包裹)

还是要先将View controller-based status bar appearance设为YES,然后在该控制器内添加

-(UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

还不够,需要自定义navigationController,然后在里面重写下面方法:
- (UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
这是因为被导航控制器包裹的控制器view上显示的状态栏其实是导航控制器状态栏的样式,所以用该方法将其样式改写。

因此,在有导航控制器的情况下,如果想统一设置app内控制器view状态栏颜色,而又不想与启动图上的一样,又不使用UIApplication管理的方法,除了更改navigationBar.barStyle那个方式以外。还可以在自定义的navigationController里面重写preferredStatusBarStyle方法,如果还需要单独定义某个控制器view的状态栏颜色,加入上面的设置就可以了,微博个人主页示例中就用到了此方法。

5. 在控制器View中随时更改状态栏颜色

需要调用下面的setNeedsStatusBarAppearanceUpdate方法,这个方法会通知系统去调用当前控制器的preferredStatusBarStyle方法,然后在preferredStatusBarStyle方法里面根据情况来返回不同状态就行了。

总结:

  1. 如果将View controller-based status bar appearance设置为NO,不在UIApplication管理的情况下,所有控制器view上状态栏的只受启动图导航栏颜色设置的影响(保持一样),其它任何设置都不起作用。
  2. 如果将View controller-based status bar appearance设置为YES。所有控制器View上状态栏首先受navigationBar的barStyle影响,为UIBarStyleBlack时状态栏字体颜色为白色,UIBarStyleDefault时状态栏前景部分颜色为黑色。
    只有将View controller-based status bar appearance设置为YES的情况下,才能单独修改某个控制器View的状态栏前景部分颜色,更改方法见3,4部分。

推荐阅读更多精彩内容