在iOS开发过程中,经常会设置状态栏的样式,所以这里来学习一下状态栏的常用的设置方法。

1.首先明白状态栏的基本概念


ios上状态栏 就是指的最上面的20像素高的部分
状态栏分前后两部分,要分清这两个概念,后面会用到:

  • 前景部分:就是指的显示电池、时间等部分;
  • 背景部分:就是显示黑色或者图片的背景部分;如下图:前景部分为白色,背景部分为黑色

ios rn 状态栏高度 获取 ios设置状态栏_ios开发

注意:官方文档里面讲的很清楚,iOS7以后才有状态栏的自定义设置,所以该文章对iOS7之前可能无效!

2.设置状态栏前景和背景



这里必须注意:设置状态栏的时候,首先分为两种情况,其一:在plist里面设置了View controller-based status bar appearance为NO,这个属性的意义就是不让控制器基于status bar appearance的设置,也就是自己可以在每一个控制器里面自己进行设置。这个时候就不能再用

- (UIStatusBarStyle)preferredStatusBarStyle这个方法来设置,是没有效果的,而必须要用[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]来设置,其二,当plist里面设置了View controller-based status bar appearance为YES,或者没有设置的时候(默认为YES),这个时候可以根据(UIStatusBarStyle)preferredStatusBarStyle这个方法来设置,用这个方法的时候也分为两种情况,一种情况是当前要设置的ViewController嵌入在一个NavigationController里面的时候,


系统默认的将指定状态栏的权利交给了导航控制器,要是想让导航控制器的

childViewController

来设置状态栏的颜色,就要自定义导航控制器来指定!

 

自定义导航控制器后,要是想指定状态栏由谁来设置,就需要说明清楚权利交给谁,下面两个方法都可以来指定,通过方法名也可以很清楚的理解,

preferredStatusBarStyle

这个方法重写,来返回想要指定的控制器的这个方法的返回结果,

childViewControllerForStatusBarStyle

这个方法则是用来说明让谁来拥有这个权利,两个方法都可以做的,自己选择即可,个人觉得第一个比较好,指定清楚之后,直接调这个控制器的这个方法返回值即可

- (UIStatusBarStyle)preferredStatusBarStyle
{
    ViewController *vc = self.topViewController;
    return [vc preferredStatusBarStyle];
}

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


完成上面的自定义后,只要在当前的Viewcontroller里面实现

preferredStatusBarStyle方法,设置好想要的状态栏颜色,然后在需要变更的地方调用[selfsetNeedsStatusBarAppearanceUpdate];


(这个方法会通知系统去调用当前UIViewController的preferredStatusBarStyle方法),这个和UIView的setNeedsDisplay原理差不多(调用UIView对象的setNeedsDisplay方法后,系统会在下次页面刷新时,调用重绘该view,系统最快能1秒刷新60次页面,具体要看程序设置),

下面在进行分情况的讨论


  • 设置statusBar的【前景部分】


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


默认的黑色(UIStatusBarStyleDefault)

白色(UIStatusBarStyleLightContent)

可以设置的地方有两个:plist设置里面 和 程序代码里



1.plist设置statusBar



在plist里增加一行 UIStatusBarStyle(或者是“Status bar style”也可以),然后在后面设置相应的至即可,在程序启动完成后就会设置为plist里面指定的颜色。

2.代码设置statusBar

1》

<span style="font-size:14px;">[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; </span>
<span style="font-size:14px;">
</span>
//相对于上面的接口,这个接口可以动画的改变statusBar的前景色  
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

但是注意,上面的这种代码设置的前提是必须在plist里面指定一个属性,即

View controller-based status bar appearance设置为NO,然后在viewWillAppear里面执行上面的代码,才会设置成功,否则是不会成功的!上面这个属性的意思可以理解为控制器不基于status bar appearance,也就是说控制器可以自己进行自定义,每一个控制器都可以进行状态栏的设置,不必拘于 bar appearance。

2》

<span style="font-size:14px;">- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}</span>

这种设置方式则不必再在plist里面设置什么属性,直接就会生效,所以一般还是用这种方式设置比较方便。

3》

以上两种方法一般是在刚进入一个控制器的时候进行设置,还有一种情况是需要动态的根据用户交互来动态的改变状态栏的颜色

- (void)testStatusBar
{
    UIStatusBarStyle style = [UIApplication sharedApplication].statusBarStyle;
    if (style) {
        [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
    } else {
        [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
    }
    
}

这样就可以做到动态的设置颜色了!


  • 设置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即可。