ios 9 statusBar style

状态栏的相关设置(UIStatusBar)

statusBar


设置statusBar的【前景部分】

简单来说,就是设置显示电池电量、时间、网络部分标示的颜色, 这里只能设置两种颜色:

  • 默认的黑色(UIStatusBarStyleDefault)
  • 白色(UIStatusBarStyleLightContent)

可以设置的地方有两个: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

注意:

  • 这里如果你只是简单的return一个固定的值,那么该UIViewController显示的时候,程序就会马上调用该方法,来改变statusBar的前景部分;
  • 如果在该UIViewController已经在显示在当前,你可能还要在当前页面不时的更改statusBar的前景色,那么,你首先需要调用下面的setNeedsStatusBarAppearanceUpdate方法(这个方法会通知系统去调用当前UIViewController的preferredStatusBarStyle方法), 这个和UIView的setNeedsDisplay原理差不多(调用UIView对象的setNeedsDisplay方法后,系统会在下次页面刷新时,调用重绘该view,系统最快能1秒刷新60次页面,具体要看程序设置)。
  • [self setNeedsStatusBarAppearanceUpdate];

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,则参考上面的讲解。


设置statusBar的【背景部分】

系统提供的方法

navigationBar的setBarTintColor接口,用此接口可改变statusBar的背景色

  • 注意:一旦你设置了navigationBar的- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics接口,那么上面的setBarTintColor接口就不能改变statusBar的背景色,statusBar的背景色就会变成纯黑色。

另辟蹊径

创建一个UIView,
设置该UIView的frame.size 和statusBar大小一样,
设置该UIView的frame.origin 为{0,-20},
设置该UIView的背景色为你希望的statusBar的颜色,
在navigationBar上addSubView该UIView即可。

最后: Present Modal Controller

需要指出的是,如果一个 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值