iOS之StatusBar详解
随便打开手机上的主流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.rootViewController的preferredStatusBarStyle方法,而不是当前控制器的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.topViewController的preferredStatusBarStyle方法,这样写的话,就能保证当前显示的UIViewController的preferredStatusBarStyle方法能被调用,从而实现statusBar的前景颜色。
然后在application didFinishLaunchingWithOptions:方法里把UINavigationController换成ZXNavigationController :
self.window.rootViewController = [[ZXNavigationController alloc] initWithRootViewController:viewVontroller];
复制代码
Run一下,就会发现:齐活儿了~
如果设置了UIViewControllerBasedStatusBarAppearance为NO;那么就需要显式地通过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详解相关推荐
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...
- IOS 多线程04-GCD详解 底层并发 API
IOS 多线程04-GCD详解 底层并发 API 注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大 ...
- iOS核心动画详解swift版----基础动画
2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...
- iOS教程:详解iOS多图下载的缓存机制
ios教程,ios的干货一直来不及给大家分享,小编也是一直在忙啊!今天给大家献上ios:详解iOS多图下载的缓存机制 1. 需求点是什么? 这里所说的多图下载,就是要在tableview的每一个cel ...
- iOS TableView 使用详解
IOS TableView 详解 一.建立 UITableView DataTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, ...
- iOS 内购详解-代码篇
内购项目-代码篇 一.分步骤说明 1.获取商品列表 2.苹果服务器返回的可购买商品 3.下单购买商品 4.购买队列状态变化,判断购买状态是否成功 5.交易验证 6.拿到的收据信息是,此App所有购买的 ...
- ios NSFileManager 用法详解
2019独角兽企业重金招聘Python工程师标准>>> iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileMana ...
- iOS runtime 底层详解、内部原理、场景应用
前言学:位域和共用体 一:isa指针--runtime之前的学习 1.1:苹果应用的按位或.按位与 二:类对象信息 2.1:类对象信息:rw_t 2.2:类对象信息:方法缓存(很关键) 2.2:类对象 ...
- 【转】iOS Memory 内存详解
0. 前言 本文以 iOS Memory 的相关内容作为主题,主要从一般操作系统的内存管理.iOS 系统内存.app 内存管理等三个层面进行了介绍,主要内容的目录如下: iOS 是基于 BSD 发展而 ...
- iOS Memory 内存详解
Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨Rickey 来源丨一瓜技术(tech_gua ...
最新文章
- 卷积神经网络基础:(6)卷积神经网络原理
- Grid Infrastructure 的较好的例子
- 韩师师范学院计算机科学与技术在哪个学区,2017年韩山师范学院本科插班生考试《数据结构》A卷...
- innodb存储引擎 - 锁
- 长安渝北工厂机器人_长安UNI-T智能工厂:机器人、激光焊, 一分钟一台车
- JQuery中trim函数的具体实现代码
- cron表达式在线测试
- .net mysql 序号_MYSQL如何自动为查询数据的结果编上序号详解
- 网络攻防实验(五)——201521460003王浩洋
- 新媒体营销操作手法及案例分享-初贵民
- 博文视点新书样章下载
- 为什么高斯滤波器被广泛用于图像处理?
- 博应用官网交互设计五个层次理论,你怎么看
- MiniOSD DIY记
- CDH-TXKT-集群的维护
- 计算机内存满了 可是硬盘空的,为什么计算机内存不足
- oracle字符串截取substr和字符串查找instr
- syn泛洪 过滤_SYN泛洪攻击详解
- Java核心机制(1)
- 【学习笔记】HTML+CSS模仿静态淘宝首页
热门文章
- RabbitMQ ACK 机制的意义是什么?
- Selenium 新手入门(C#)1. 用vs运行调用Selenium打开页面
- VS2010对Excel操作---DLL向
- D16 Group Decimort 2 Mac - 经典复古采样器
- 电钢琴插件:Applied Acoustics Systems Lounge Lizard EP-4 for Mac
- Mac新手入门:关于Mac睡眠、开机密码的取消与更改教程
- Intel Mac无法使用macOS Monterey系统部分新功能
- Ubuntu 20.04 安装 php 并配置 OpenResty
- react-router中进行路由控制
- robots笔记以免忘记