【Objective-c】状态栏UIStatus Bar设置

项目需求:在VC的顶部添加ImageView,并且该图片要跟状态栏一体

《【Objective-c】状态栏UIStatus Bar设置》

第一时间的灵感是设置状态栏字体的为白色,接着设置设置状态栏的背景颜色为透明。沿着思路,学习状态栏StatusBar

首先,状态栏StatusBar分前景色(文字和图案的颜色)、背景色(整条导航栏的颜色)

前景色

//前景色就只有黑色和白色可以选择
//白色
UIStatusBarStyleLightContent    
//黑色(默认)
UIStatusBarStyleDefault
实现方法有两种
1、plist文件

在plist列表中添加一行“UIStatusBarStyle“,并设置为上面介绍中一种
,这样app在启动launch页面的时候,statusBar显示的就是plist设置的风格

2、代码实现

iOS_9.0以下的方式,不管有没有导航栏,只要设置UIStatusBarStyle的方法,并且在plist列表中添加“View controller-based status bar appearance”其值为“NO”都可以更改前景色

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

iOS_9.0以上版本的,更换了新API,通过调用
”- (UIStatusBarStyle)preferredStatusBarStyle“返回需要的样式,但是要注意的是,有导航栏和没导航栏是有区别的
前提:在plist列表中添加“View controller-based status bar appearance”,并设置为“YES”(是默认值)

无导航栏

 /** 
    当VC显示的时候就会自动调用这个方法,如果在当前VC不变的时动态改变前景色, 可以通过VC 调动“setNeedsStatusBarAppearanceUpdate”.
*/  
- (UIStatusBarStyle)preferredStatusBarStyle{
    //statusBar 前景色只有两种选择:
    //黑色(默认的):UIStatusBarStyleDefault
    //白色:UIStatusBarStyleLightContent
    return UIStatusBarStyleLightContent;
}

有导航栏
也是使用同样的方法“preferredStatusBarStyle”,但是只是重写这个方法是不行的,打个断点可以发现ViewController不会进入这个方法,这里就要理理调用的

机制:

当ViewController 开始显示的时候或者调用setNeedsStatusBarAppearanceUpdate方法,系统会调用widow.rootViewController的“preferredStatusBarStyle”方法,也就是说
再用导航栏时不会调动ViewController的“preferredStatusBarStyle”,解决的办法是创建一个UINavigationController的类别,并在.m文件中重写“preferredStatusBarStyle”方法,返回值为“self.topViewController”,意思就是由“self.topViewController”调用“preferredStatusBarStyle”方法

#import "UINavigationController+VCBar.h"
@implementation UINavigationController (VCBar)
- (UIViewController *)childViewControllerForStatusBarStyle{
    return self.topViewController;
}
@end

背景色

无导航栏或者导航栏隐藏时,statusBar的背景色默认是跟VC的根视图背景色一致
有导航栏时,状态栏背景色默认是跟导航栏一直的

单独设置导航栏颜色

    //获取状态栏,设置背景色
    UIView *statusBar = [[[UIApplication sharedApplication]valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
    if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
        statusBar.backgroundColor = color;
    }
要实现上面的效果,只需要导航栏隐藏,并且将ImageView的y坐标设置为-20即可
总结:

“[UIApplication sharedApplication].statusBarStyle ” 只有在“View controller-based status bar appearance”值为“NO”才有效,并且是全局有效。

“- (UIStatusBarStyle)preferredStatusBarStyle” 只有在“View controller-based status bar appearance”值为“YES”才有有效(默认值是YES),并且只是设置当前的状态栏,所以必须每个VC设置。

感谢博文:
https://my.oschina.net/shede333/blog/304560
http://www.jianshu.com/p/5c09c2700038

    原文作者:MR_詹
    原文地址: https://www.jianshu.com/p/598d07e556e1
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞