在iOS开发过程中,经常会设置状态栏的样式,所以这里来学习一下状态栏的常用的设置方法。
1.首先明白状态栏的基本概念
ios上状态栏 就是指的最上面的20像素高的部分
状态栏分前后两部分,要分清这两个概念,后面会用到:
- 前景部分:就是指的显示电池、时间等部分;
-
背景部分:就是显示黑色或者图片的背景部分;
如下图:前景部分为白色,背景部分为黑色
- (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
<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。<span style="font-size:14px;">- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}</span>
这种设置方式则不必再在plist里面设置什么属性,直接就会生效,所以一般还是用这种方式设置比较方便。- (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即可。
来源:CSDN
作者:yungeIOS
链接:https://blog.csdn.net/yungeIOS/article/details/52095016