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

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

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

2.UIStatusBarStyleLightContent

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

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地址

iOS之StatusBar详解相关推荐

  1. iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)

    前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...

  2. IOS 多线程04-GCD详解 底层并发 API

    IOS 多线程04-GCD详解 底层并发 API 注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大 ...

  3. iOS核心动画详解swift版----基础动画

    2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...

  4. iOS教程:详解iOS多图下载的缓存机制

    ios教程,ios的干货一直来不及给大家分享,小编也是一直在忙啊!今天给大家献上ios:详解iOS多图下载的缓存机制 1. 需求点是什么? 这里所说的多图下载,就是要在tableview的每一个cel ...

  5. iOS TableView 使用详解

     IOS TableView 详解 一.建立 UITableView DataTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, ...

  6. iOS 内购详解-代码篇

    内购项目-代码篇 一.分步骤说明 1.获取商品列表 2.苹果服务器返回的可购买商品 3.下单购买商品 4.购买队列状态变化,判断购买状态是否成功 5.交易验证 6.拿到的收据信息是,此App所有购买的 ...

  7. ios NSFileManager 用法详解

    2019独角兽企业重金招聘Python工程师标准>>> iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileMana ...

  8. iOS runtime 底层详解、内部原理、场景应用

    前言学:位域和共用体 一:isa指针--runtime之前的学习 1.1:苹果应用的按位或.按位与 二:类对象信息 2.1:类对象信息:rw_t 2.2:类对象信息:方法缓存(很关键) 2.2:类对象 ...

  9. 【转】iOS Memory 内存详解

    0. 前言 本文以 iOS Memory 的相关内容作为主题,主要从一般操作系统的内存管理.iOS 系统内存.app 内存管理等三个层面进行了介绍,主要内容的目录如下: iOS 是基于 BSD 发展而 ...

  10. iOS Memory 内存详解

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨Rickey 来源丨一瓜技术(tech_gua ...

最新文章

  1. 卷积神经网络基础:(6)卷积神经网络原理
  2. Grid Infrastructure 的较好的例子
  3. 韩师师范学院计算机科学与技术在哪个学区,2017年韩山师范学院本科插班生考试《数据结构》A卷...
  4. innodb存储引擎 - 锁
  5. 长安渝北工厂机器人_长安UNI-T智能工厂:机器人、激光焊, 一分钟一台车
  6. JQuery中trim函数的具体实现代码
  7. cron表达式在线测试
  8. .net mysql 序号_MYSQL如何自动为查询数据的结果编上序号详解
  9. 网络攻防实验(五)——201521460003王浩洋
  10. 新媒体营销操作手法及案例分享-初贵民
  11. 博文视点新书样章下载
  12. 为什么高斯滤波器被广泛用于图像处理?
  13. 博应用官网交互设计五个层次理论,你怎么看
  14. MiniOSD DIY记
  15. CDH-TXKT-集群的维护
  16. 计算机内存满了 可是硬盘空的,为什么计算机内存不足
  17. oracle字符串截取substr和字符串查找instr
  18. syn泛洪 过滤_SYN泛洪攻击详解
  19. Java核心机制(1)
  20. 【学习笔记】HTML+CSS模仿静态淘宝首页

热门文章

  1. RabbitMQ ACK 机制的意义是什么?
  2. Selenium 新手入门(C#)1. 用vs运行调用Selenium打开页面
  3. VS2010对Excel操作---DLL向
  4. D16 Group Decimort 2 Mac - 经典复古采样器
  5. 电钢琴插件:Applied Acoustics Systems Lounge Lizard EP-4 for Mac
  6. Mac新手入门:关于Mac睡眠、开机密码的取消与更改教程
  7. Intel Mac无法使用macOS Monterey系统部分新功能
  8. Ubuntu 20.04 安装 php 并配置 OpenResty
  9. react-router中进行路由控制
  10. robots笔记以免忘记