Ekulelu's Blog

iOS改变状态栏颜色和隐藏

状态栏在iOS系统里面高度是固定的20单位。一般改变说的改变它的颜色,其实是改变它的几个图标(信号,电池)的颜色,而且这个颜色系统是做了限制的,只有白色和黑色两种选择,称为两种style。在iOS7之前,一般用来设置style的方法是

1
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

而设置隐藏的方法为:(系统另外还提供了对应的带动画的方法。)

1
[[UIApplication sharedApplication] setStatusBarHidden:YES];

留意到上面的方法是通过UIApplication来调用的,也就是说这个是针对整个app都会产生效果的方法。

但是从iOS7开始,出了一个取代上面两种方法的模式,系统给每个UIViewController都配置了三个新方法用来控制状态栏,通过重写这三个方法来定义每个UIViewController自己的状态栏,这样如果不重写这些方法的UIViewController就会使用默认的值。这样就比改变整个app来得更加有定制化。并且在iOS7之后,你直接使用上面的方法两个老方法来改变状态栏都是没有效果的。如果需要使这两个老方法生效,需要在项目的info.plist里面将下面的属性设置为NO,这个属性默认是YES。但是要注意的是,老方法和新方法是不兼容的,只能只用一种解决方案。

View controller-based status bar appearance

下面来介绍新方法,总共有三个方法,分别是:

1
2
3
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation;
- (UIStatusBarStyle)preferredStatusBarStyle;
- (BOOL)prefersStatusBarHidden;

按照方法的名字都可以猜到是做什么用的了。需要说一下的是动画虽然提供了三种样式,但我实在是没看出来有什么区别。这三个方法都是在UIViewController的viewDidload之后,viewWillAppear之前被系统调用一次。次序依次是:

preferredStatusBarStyle ->
prefersStatusBarHidden->
preferredStatusBarUpdateAnimation

如果你在UIViewController里面想对状态栏进行调节,必须使用下面的方法来刷新状态栏

1
[viewController setNeedsStatusBarAppearanceUpdate];

总的来讲,我个人建议使用新方法来控制,因为如果你需要修改状态栏的地方少,那么就只在需要变化的UIViewController中重写方法就行了,其他的地方都是系统默认的,这个默认状态可以通过修改工程的配置文件改变。如果你切换状态栏的次数很多,那么就用这种配置方法也和老方法一样使用,而且不会拍影响到其他的UIViewController。

另外需要提的一点是在UINavigationController里面,上面的新方法的设置style的方法似乎不管用,你会发现系统调用了也没有用,而且变化状态很奇怪。这个时候你需要自定义一个UINavigationController,并且实现下面的方法

1
2
3
- (UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}

这样就可以了,这里虽然也有下面这样一个方法,但是实际测试发现你不重写,Navigation里面的子ViewController的重写方法也是对statusbar的hidden起作用。感觉是iOS的bug。

1
2
3
- (UIViewController *)childViewControllerForStatusBarHidden {
return self.topViewController;
}