随便打开手机上的主流APP,我们不难发现它们的状态栏都是跟导航栏保持一致的背景颜色,如下图的微信和instagram:

WECHAT.PNG

INS.PNG

那么今天我们就来说一下StatusBar这个只有区区20像素高度的小东西。

UIStatusBarStyle

状态栏有两种显示风格:
1.UIStatusBarStyleDefault

default.png

2.UIStatusBarStyleLightContent

lightContent.png

那么它的背景颜色是怎么加上去的呢?很简单,看代码:

UIView *statusBar = [[UIView alloc] initWithFrame:CGRectMake(0, -20, self.view.frame.size.width, 20)];

statusBar.backgroundColor = myColor;

[self.navigationController.navigationBar addSubview:statusBar];

看完代码就知道没什么可说的了。

要改变状态栏的显示样式(前景颜色)需要在ViewContoller里重载方法:

- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}

但是上面这个方法不能直接调用,需要通过下面这个方法来刷新状态栏的样式,例如:

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated]; [self setNeedsStatusBarAppearanceUpdate];
}

如果你按照上面说的,在自己的ViewController里面设置一番之后,运行发现你的状态栏还是默认状态...那就对了,因为远没有那么容易。你还需要耐心往下看...

UIViewControllerBasedStatusBarAppearance

info.plist中可以设置状态栏的外观是否是基于视图控制器,键的名称就是UIViewControllerBasedStatusBarAppearance,如果不设置那么它的默认值是YES,表示视图控制器决定了状态栏的风格;如果值设置为NO,则表示每个视图控制器必须显式地使用UIApplication对象来设置状态栏的风格。

哎~这个时候你肯定会疑惑了,我按照你上面说的没有设置plist文件啊,所以默认是YES,那么就是由视图控制器来决定状态栏风格啊,为什么不对呢?

childViewControllerForStatusBarStyle

当我们调用setNeedsStatusBarAppearanceUpdate时,系统会调用application.window.rootViewControllerpreferredStatusBarStyle方法,而不是当前控制器的preferredStatusBarStyle方法。在这个时候,一个重要的方法就要派上用场了,那就是:childViewControllerForStatusBarStyle

childViewControllerForStatusBarStyle默认返回nil。所以我们需要重写这个方法。

假设你的APP里根视图是导航控制器:

self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:viewVontroller];

那么,我们子类化一个导航控制器ZXNavigationController,重写它的childViewControllerForStatusBarStyle方法:

@implementation ZXNavigationController

- (UIViewController *)childViewControllerForStatusBarStyle
{
return self.topViewController;
} - (void)viewDidLoad {
[super viewDidLoad];
}

上面代码的意思就是说,不要调用我自己也就是UINavigationController的preferredStatusBarStyle方法,而是去调用navigationController.topViewControllerpreferredStatusBarStyle方法,这样写的话,就能保证当前显示的UIViewController的preferredStatusBarStyle方法能被调用,从而实现statusBar的前景颜色。

然后在application didFinishLaunchingWithOptions:方法里把UINavigationController换成ZXNavigationController :

self.window.rootViewController = [[ZXNavigationController alloc] initWithRootViewController:viewVontroller];

Run一下,就会发现:齐活儿了~

如果设置了UIViewControllerBasedStatusBarAppearanceNO;那么就需要显式地通过UIApplication对象来设置状态栏的风格:

self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:viewVontroller];
//setStatusBarStyle从9.0开始不被推荐使用了:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

最后

说了这么多,简单粗暴地概括下就是:如果想改变StatusBar的显示风格,把UIViewControllerBasedStatusBarAppearance设置为NO,然后通过UIApplication对象设置StatusBar 的 Style。

Demo_Git地址

最新文章

  1. javascript冒泡算法
  2. MooseFs-分布式文件系统系列(一)之了解并安装它
  3. unity, 顶点对齐
  4. 软件工程(GZSD2015)第二次作业文档模板
  5. CRM PrincipalObjectAccess(POA)
  6. Winfrom 抓取web页面内容代码
  7. 显示 SQLite 日志
  8. 呜呼!Node.js是什么?
  9. The Django template language 阅读批注
  10. BGP协议
  11. OpenVPN的那些坑
  12. Centos7下,简单DOCKER 使用.映射SSH端口到宿主主机.
  13. 微信二维码支付-模式一(PC端,解决中文乱码问题)
  14. DS博客作业02—线性表
  15. 【Maven Jenkins】No resource to compile 还有多少坑要踩。。。LongTimeNoSee
  16. 三次Java实验整理汇报:
  17. 设置select,option文本居中
  18. Retrofit2 动态(静态)添加请求头Header
  19. ngResource和REST介绍
  20. web移动端一些常用知识

热门文章

  1. servlet学习(1)
  2. 湖南省第八届大学生计算机程序设计竞赛(A,B,C,E,F,I,J)
  3. SQL查询结果排序
  4. nodejs学习(三)--express连接mysql数据库,mysql查询封装
  5. Ubuntu+PyQt5+Python3.6+Qt Designer 实现可视化窗口的编辑
  6. python3 时间处理
  7. linux中内存泄漏的检測(五)记录内存泄漏的代码
  8. bug 7715339 登录失败触发 ‘row cache lock’ 等待
  9. lubuntu自动登录(lxde)
  10. code blocks常用快捷键