项目需求:在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