希望大家可以關注一下我的個人博客 www.tunnycoder.com
最近在改公司的就项目,遇到了引用一些第三方框架,但是框架修改了状态栏的属性。由于是旧项目,代码很是臃肿,导致改了多处才搞定。故此总结一下 iOS 状态栏 StatusBar 相关技巧。
<!--more-->
IOS7 之后,系统提供了 2 种管理状态栏的方式:
1> 通过 UIViewController 管理(每一个 UIViewController 都可以拥有自己不同的状态栏)
2> 通过 UIApplication 管理(一个应用程序的状态栏都由它来统一管理)
PS : IOS7 中,默认情况下,状态栏都是由 UIViewController 管理的。但是一般都是交给 UIApplication 来管理
首先得修改 Info.plist 的设置:
1. View controller-based status bar appearance YES; 则 View controller 对 status bar 的设置优先级高于 application 的设置;
2. View controller-based status bar appearance NO; 则以 application 的设置为准;
直接在 Application 代理中设置:
application.statusBarHidden = NO;
application.statusBarStyle = UIStatusBarStyleLightContent;
状态栏的相关方法:(在控制器中实现)
//设置状态栏隐藏
- (BOOL)prefersStatusBarHidden
{
return YES;
}
//调整状态栏
- (UIStatusBarStyle)preferredStatusBarStyle
{
//Dark content, for use on light backgrounds
//在亮背景上显示黑内容
return UIStatusBarStyleDefault;
//Light content, for use on dark backgrounds
//在黑背景上,显示亮内容
// return UIStatusBarStyleLightContent;
}
如果出现设置了View controller-based status bar appearance YES;
,但是设置状态栏的相关方法不执行。则有可能的原因是: viewController 是添加到导航上的。
UINavigationController 不会将 preferredStatusBarStyle 方法调用转给它的子视图,而是由它自己管理状态,而且它也应该那样做.因为 UINavigationController 包含了它自己的状态栏。因此就算 UINavigationController 中的 viewController 实现了preferredStatusBarStyle()
方法 也不会被调用。
因此如果控制器是添加在 UINavigationController 上的,它是基于它的UINavigationBar.barStyle
属性。也就是说,如果 viewController 是在导航中的,想要改变状态栏文本颜色,那么需要通过代码:
//将 status bar 文本颜色设置为白色
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
//将 status bar 文本颜色设置为黑色 ,默认就是黑色
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
此外,如果 viewController 在导航控制器中,还想通过 preferredStatusBarStyle 方法设置状态栏文本颜色,那就只能隐藏导航栏了:
//隐藏导航栏后 系统会调用 preferredStatusBarStyle 方法
self.navigationController.navigationBarHidden = YES;
1
loveuqian 2015-12-03 23:55:44 +08:00
讲的太浅啦。。我之前遇到的状态栏问题都没有说
|
2
xi_lin 2015-12-04 00:00:45 +08:00
不知道有没有办法在同一个 ViewController 里滚动的时候变化 status bar 的颜色?
|
3
a412739861 2015-12-04 00:09:29 +08:00 via iPhone
@xi_lin 调用一个函数, setxxneedxxxupdate ,然后,在上面两个状态返回值里面加判断。
手机没补全,真的是一点打不出来…白天再打… |
4
IamJ 2015-12-04 01:01:21 +08:00
楼上说的是 setNeedsStatusBarAppearanceUpdate
|
6
loveuqian 2015-12-04 09:27:32 +08:00
@tunnyios
之前遇到 2 个问题 1.我建了一个透明高 20 的 window 挡在状态栏处,想点击这个 window 就自动将当前显示的 scrollView 包括子类返回顶部,但是状态不见了 2.我在用动画切换 keyWindow 的根控制器时,状态栏也不见了 这问题虽然我都解决了。但都是不知道具体原因是什么 |
7
xi_lin 2015-12-04 10:48:48 +08:00
|