iOS_状态栏UIStatus Bar设置

2017-01-14 10:45:23来源:http://www.jianshu.com/p/598d07e556e1作者:MR_詹人点击

第七城市

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




第一时间的灵感是设置状态栏字体的为白色,接着设置设置状态栏的背景颜色为透明。沿着思路,学习状态栏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




第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台