iOS 状态栏 StatusBar 的相关使用

2015-12-03 23:34:18 +08:00
 tunnyios
希望大家可以關注一下我的個人博客 [www.tunnycoder.com]( http://www.tunnycoder.com)

## **iOS 状态栏 StatusBar 的相关使用**
最近在改公司的就项目,遇到了引用一些第三方框架,但是框架修改了状态栏的属性。由于是旧项目,代码很是臃肿,导致改了多处才搞定。故此总结一下 iOS 状态栏 StatusBar 相关技巧。
<!--more-->

### **设置 StatusBar**
IOS7 之后,系统提供了 2 种管理状态栏的方式:

1> 通过 UIViewController 管理(每一个 UIViewController 都可以拥有自己不同的状态栏)
2> 通过 UIApplication 管理(一个应用程序的状态栏都由它来统一管理)
PS : IOS7 中,默认情况下,状态栏都是由 UIViewController 管理的。但是一般都是交给 UIApplication 来管理

#### **设置控制器管理 StatusBar /设置 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 的设置为准;

#### **UIApplication 中设置状态栏的相关方法**
直接在 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;
```
3346 次点击
所在节点    iOS
7 条回复
loveuqian
2015-12-03 23:55:44 +08:00
讲的太浅啦。。我之前遇到的状态栏问题都没有说
xi_lin
2015-12-04 00:00:45 +08:00
不知道有没有办法在同一个 ViewController 里滚动的时候变化 status bar 的颜色?
a412739861
2015-12-04 00:09:29 +08:00
@xi_lin 调用一个函数, setxxneedxxxupdate ,然后,在上面两个状态返回值里面加判断。
手机没补全,真的是一点打不出来…白天再打…
IamJ
2015-12-04 01:01:21 +08:00
楼上说的是 setNeedsStatusBarAppearanceUpdate
tunnyios
2015-12-04 09:10:28 +08:00
@loveuqian 还有哪些呢?我也想学习学习
loveuqian
2015-12-04 09:27:32 +08:00
@tunnyios
之前遇到 2 个问题
1.我建了一个透明高 20 的 window 挡在状态栏处,想点击这个 window 就自动将当前显示的 scrollView 包括子类返回顶部,但是状态不见了
2.我在用动画切换 keyWindow 的根控制器时,状态栏也不见了
这问题虽然我都解决了。但都是不知道具体原因是什么
xi_lin
2015-12-04 10:48:48 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/241000

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX