Statusbar状态栏样式

From: http://www.jianshu.com/p/ae47fdbf28fd

很多时候我们需要修改页面的Statusbar的样式,这里的样式是固定的,系统仅提供了两种:

typedef NS_ENUM(NSInteger, UIStatusBarStyle) {
    UIStatusBarStyleDefault                                     = 0, // Dark content, for use on light backgrounds
    UIStatusBarStyleLightContent     NS_ENUM_AVAILABLE_IOS(7_0) = 1, // Light content, for use on dark backgrounds

    UIStatusBarStyleBlackTranslucent NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 1,
    UIStatusBarStyleBlackOpaque      NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2,
} __TVOS_PROHIBITED;

这里是对UIStatusBarStyle的枚举,虽然有四个,但是后两个是在iOS7.0之后废弃的,使用的时候会有警告,所以,实际上只有两种

UIStatusBarStyleLightContent

UIStatusBarStyleDefault

下面,我们就来看一看,怎么在项目中根据我们的需要进行选择;
与状态栏相关的方法主要有以下几个:

- (UIStatusBarStyle)preferredStatusBarStyle NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarStyleDefault
- (BOOL)prefersStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to NO
// Override to return the type of animation that should be used for status bar changes for this view controller. This currently only affects changes to prefersStatusBarHidden.
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade

第一个是状态栏的样式,第二个是否隐藏状态栏,第三个是动画方式;

1. 不含有导航

如果工程中没有使用导航,我们直接在ViewController中重写上面的方法就可以修改状态栏的样式了:

- (UIStatusBarStyle)preferredStatusBarStyle {

    return UIStatusBarStyleLightContent;
}

这样可以根据我们的需求在不同的页面进行修改,隐藏,显示状态栏;
但是,当我们使用了导航后,好像没效果了?

2. 含有导航

如果使用了导航,我们再去重写上面的方法,就失去作用了,查了写资料,发现:

UINavigationController不会将 preferredStatusBarStyle方法调用转给它的子视图,而是由它自己管理状态,而且它也应该那样做.因为UINavigationController 包含了它自己的状态栏;
因此就算 UINavigationController中的viewController 实现了 preferredStatusBarStyle方法 也不会调用

那么,我们怎么在使用导航的时候修改status bar的状态呢?

它是基于它的 UINavigationBar.barStyle属性.默认(UIBarStyleDefault)的是黑色文本的状态栏 而 UIBarStyleBlack是设置为白色文本的状态栏;

也就是说,如果viewController是在导航中的,想要改变状态栏文本颜色,那么需要通过代码:

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;//设置为白色
self.navigationController.navigationBar.barStyle = UIBarStyleDefault;//设置为黑色

很多时候,我们虽然使用了导航,但是导航条都是我们自定义的,这个时候,我们隐藏了系统的导航:

self.navigationController.navigationBarHidden = YES;//隐藏系统导航

这时,我们就可以在ViewController里重写preferredStatusBarStyle方法,来设置状态栏的样式了,方式同1;

PS:如果我们设置了不同页面的状态栏样式,但是在进入到相应页面时,状态栏并没有按我们的预期发生变化,可尝试调用下面的方式试试:

- (void)setNeedsStatusBarAppearanceUpdate

3. 设置全局的状态栏

如果我们想更改所有的状态栏为同样状态,可以在设置中进行修改:
在info.plist中添加如下字段:

<key>View controller-based status bar appearance<key>
<value>NO<value>

类型为Boolean,设置为NO;

设置为NO后,就不能使用代码控制状态栏的样式了;如果想用代码控制,就在这里设置为YES,当然,这样在下面的设置就无效了 (注:UIApplication.shared.statusBarStyle = UIStatusBarStyle.default 还是有效的)

然后在项目的额General–>Deployment Info–>Status Bar Style中选择需要的样式:

这样,项目中所有的状态栏就都变为白色的了;

4. 总结

上面的第三种方法虽然使用简单,但是不够灵活,不能使用代码在程序中动态调整状态栏的设置,如果,APP中状态栏统一,可以使用此方法,简单,高效;如果状态栏的设置需要动态调整,就只能在方法1,2中选择了!!!

个人总结:
全局
info 中加入

View controller-based status bar appearance

NO

然后在项目的额General–>Deployment Info–>Status Bar Style中选择需要的样式:

分文件 View controller-based status bar appearance

YES
General中配置无效
重写

1
2
3
4
5
UIViewController
/// 根据info 是否起效
override var preferredStatusBarStyle: UIStatusBarStyle{
return UIStatusBarStyle.lightContent
}

http://www.jianshu.com/p/ee1c9c91a477

1
2
3
如果将View controller-based status bar appearance设置为NO,不在UIApplication管理的情况下,所有控制器view上状态栏的只受启动图导航栏颜色设置的影响(保持一样),其它任何设置都不起作用。
如果将View controller-based status bar appearance设置为YES。所有控制器View上状态栏首先受navigationBar的barStyle影响,为UIBarStyleBlack时状态栏字体颜色为白色,UIBarStyleDefault时状态栏前景部分颜色为黑色。
只有将View controller-based status bar appearance设置为YES的情况下,才能单独修改某个控制器View的状态栏前景部分颜色,更改方法见34部分。

—- kvc 来使用 ——

1
2
3
4
5
6
7
- (UIView *) statusBar{
if (_statusBar == nil){
_statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
}
return _statusBar;
}
// 设置他的隐藏和显示

Author

陈昭

Posted on

2017-08-01

Updated on

2021-12-27

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Kommentare

You forgot to set the shortname for Disqus. Please set it in _config.yml.