推荐一个博客:状态栏原理分析的比较深入:iOS状态栏详解
一、知识普及
iOS上状态栏 指最上面的20像素高的部分
状态栏分为前后两部分
前景部分:显示电池、时间、信号等部分
背景部分:显示黑色或者图片的背景部分
如下图:
黑色背景白色字体
注意:这里只涉及到ios7以及更高版本,低版本下面的讲解可能无效。
前景部分:
此处需要先明白一个参数:info.plist中 "View controller-based status bar appearance"字段。 BOOL类型。默认无该参数 (YES)。
- 值为YES时:代表状态栏由ViewController控制。
- 值为NO时:代表状态栏由Application控制。
先牢记了这个概念。理解学习会加倍进行。
一 、View controller-based status bar appearance = YES
iOS在UIViewController中提供了几个相关的接口<更多请command+鼠标左键点击进入>
- (nullable UIViewController *)childViewControllerForStatusBarStyle
//可以通过这个方法来指定修改哪个控制器上状态栏颜色。下面场景一举例。
- (UIStatusBarStyle)preferredStatusBarStyle
//控制状态栏的颜色。
- (BOOL)prefersStatusBarHidden
//控制状态栏显示与隐藏
- (void)setNeedsStatusBarAppearanceUpdate
//刷行状态栏 如果你需要在状态栏显示后再实时刷新。可以调用这个方法去刷新。该方法会寻找application的rootViewController中的修改状态栏的颜色。
贴上代码:
注:有导航栏包裹控制器。
场景一:整个项目为默认黑色,个别控制器为白色。
1. App的根视图为NAV || TAB 时,子类化NAV。重写👇方法
- (nullable UIViewController *)childViewControllerForStatusBarStyle{
//返回当前控制器
return self.topViewController;
}
2、在需要修改的子视图控制器重写👇方法
(UIStatusBarStyle)preferredStatusBarStyle{
//设置白色字体
return UIStatusBarStyleLightContent;
}
场景二:整个项目为 白色,个别控制器为黑色。(这个方法感觉不是很好,欢迎大家提供更好的方案,我也会再去想更好的方案)
1、App的根视图为NAV || TAB 时,子类化NAV。重写👇方法
- (nullable UIViewController *)childViewControllerForStatusBarStyle{
//返回当前控制器
return self.topViewController;
}
2、在需要修改的子视图控制器重写👇方法
(UIStatusBarStyle)preferredStatusBarStyle{
//设置黑色字体
return UIStatusBarStyleDefault;
}
3、创建控制器基类。重写
-(UIStatusBarStyle)preferredStatusBarStyle{
//设置白色字体
return UIStatusBarStyleLightContent;
}
二、View controller-based status bar appearance = NO(需手动添加)
iOS在UIApplication中提供了几个相关的接口。iOS9.0后废弃
- (void)setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated
这两个方法是由[UIApplication sharedApplication]调用。也可以直接调用属性的set方法
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
⚠️:使用该方法修改状态栏颜色为全局性修改。如果单纯的修改某个页面。需要结合viewWillAppear: 和 viewWillDisappear一起使用。
背景部分
方法一:系统提供的方法
调用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即可。