简单来说,就是设置显示电池电量、时间、网络部分标示的颜色, 这里只能设置两种颜色:
可以设置的地方有两个:plist设置里面 和 程序代码里
方法一:(iOS 9之前)
在info.plist文件中添加一个属性行,选中表空白地方,右键选中Add Row, 然后在列表中选中最后一个选项,也就是View controller-based status bar appearance,设置为NO(不支持在文件中设置状态栏样式),
然后在AppDelegate中写上[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent,这样的话,全局的状态栏样式就OK了。其他的界面如果想要改变样式的话,直接用
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;修改就可以了。
在程序代码里设置statusBar
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
//相对于上面的接口,这个接口可以动画的改变statusBar的前景色
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
如果用导航的还可以用一下方式实现,个人不建议
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
方法二:(iOS 9 之后,建议使用)
前提:plist文件中 View controller-based status bar appearance 需要设置为 YES
- (UIStatusBarStyle)preferredStatusBarStyle;
- (BOOL)prefersStatusBarHidden;
- (void)setNeedsStatusBarAppearanceUpdate
在IOS 9中,
建议使用-(UIStatusBarStyle)preferredStatusBarStyle; -(BOOL)prefersStatusBarHidden; 方法替代
1、子类重写viewController以上两个方法,能够正常调用.
在你自己的UIViewController里重写此方法,返回你需要的值(UIStatusBarStyleDefault 或者 UIStatusBarStyleLightContent);
/**
重写方法,子类重写可修改stateBar的颜色,调用setNeedsStatusBarAppearanceUpdate可刷新重新调用方法
@return 状态栏颜色
*/
- (UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
preferredStatusBarStyle
注意:
2、在navigtioncontroller 容器中的viewcontroller的上述方法不能够正常调用,系统根据navigtionController navigtaionbarstyle 确定statusbar 状态。
以下内容来自链接:
http://stackoverflow.com/questions/19022210/preferredstatusbarstyle-isnt-called/19513714#19513714
The UINavigationController does not forward on preferredStatusBarStyle
calls to its child view controllers. Instead it manages its own state
- as it should, it is drawing at the top of the screen where the status bar lives and so should be responsible for it. Therefor
implementing preferredStatusBarStyle in your VCs within a nav
controller will do nothing - they will never be called.The trick is what the UINavigationController uses to decide what to
return for UIStatusBarStyleDefault or UIStatusBarStyleLightContent. It
bases this on it’s UINavigationBar.barStyle. The default
(UIBarStyleDefault) results in the dark foreground
UIStatusBarStyleDefault status bar. And UIBarStyleBlack will give a
UIStatusBarStyleLightContent status bar.If you want UIStatusBarStyleLightContent on a UINavigationController
use: self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
3、需要navigation容器中viewcontroller以上方法调用,可以写两个navigtioncontroller 的类别,放入工程中,就会自己调用,(前提:plist文件中 View controller-based status bar appearance 需要设置为 YES)代码如下:
-(UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
-(UIViewController *)childViewControllerForStatusBarHidden {
return self.topViewController;
}
其中:
(1)方法:
- (UIStatusBarStyle)preferredStatusBarStyle:
(2)特殊情况,在导航中的控制器设置
- (UIViewController *)childViewControllerForStatusBarStyle:
这个接口也很重要,默认返回值为nil。当我们调用setNeedsStatusBarAppearanceUpdate时,系统会调用application.window的rootViewController的preferredStatusBarStyle方法,我们的程序里一般都是用UINavigationController做root,如果是这种情况,那我们自己的UIViewController里的preferredStatusBarStyle根本不会被调用;
这种情况下childViewControllerForStatusBarStyle就派上用场了,
我们要子类化一个UINavigationController,在这个子类里面重写childViewControllerForStatusBarStyle方法,如下:
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.topViewController;
}
上面代码的意思就是说,不要调用我自己(就是UINavigationController)的preferredStatusBarStyle方法,而是去调用navigationController.topViewController的preferredStatusBarStyle方法,这样写的话,就能保证当前显示的UIViewController的preferredStatusBarStyle方法能影响statusBar的前景部分。
另外,有时我们的当前显示的UIViewController可能有多个childViewController,重写当前UIViewController的childViewControllerForStatusBarStyle方法,让childViewController的preferredStatusBarStyle生效(当前UIViewController的preferredStatusBarStyle就不会被调用了)。
简单来说,只要UIViewController重写的的childViewControllerForStatusBarStyle方法返回值不是nil,那么,UIViewController的preferredStatusBarStyle方法就不会被系统调用,系统会调用childViewControllerForStatusBarStyle方法返回的UIViewController的preferredStatusBarStyle方法。
(3)方法:
- (void)setNeedsStatusBarAppearanceUpdate:
让系统去调用application.window的rootViewController的preferredStatusBarStyle方法,如果rootViewController的childViewControllerForStatusBarStyle返回值不为nil,则参考上面的讲解。
navigationBar的setBarTintColor接口,用此接口可改变statusBar的背景色
创建一个UIView,
设置该UIView的frame.size 和statusBar大小一样,
设置该UIView的frame.origin 为{0,-20},
设置该UIView的背景色为你希望的statusBar的颜色,
在navigationBar上addSubView该UIView即可。
需要指出的是,如果一个 view controller 被 present 出来,通常来说这个 view controller 会忽略preferredStatusBarStyle属性,你需要在它被 present 之前设置这样一个属性:
vc.modalPresentationCapturesStatusBarAppearance = true
其他说明
修改自:
https://blog.csdn.net/u012918868/article/details/80891724
以及 http://blog.csdn.net/wangqiuwei07/article/details/53220702
以及 https://blog.csdn.net/u012918868/article/details/80891724