1、UIStatusBar简介
iOS上的statusBar
就是指的最上面的20point高的部分,分为两个部分
- 前景部分:就是指显示信号、时间、电量等的状态部分
- 后景部分:就是显示黑色或者图片的背景部分
2、UIStatusBar前景
2.1 UIStatusBarStyle
UIStatusBar
的前景部分实际就是通过UIStatusBarStyle
来修改,iOS7之后就两种style,
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,
}
UIStatusBarStyleDefault
默认黑色字体
UIStatusBarStyleLightContent
白色字体
2.2 修改启动页的UIStatusBarStyle
- 【General】 -->【Deployment Info】-->【Status Bar Style】
此处可设置启动页的statusBarStyle
以及hidden
属性,Requires full screen
在支持分屏多任务时需要勾选。 -
Info.plist处修改
两处修改是同步的,修改其中一处,另一处会随之变化。
此处的修改只针对启动页有效,对viewController
不起作用。
2.3 viewController的UIStatusBarStyle
修改viewControlle
r的statusBar
有两种方式
- 方式一:通过viewController的
-(UIStatusBarStyle)preferredStatusBarStyle
方法 - 方式二:通过
UIApplication的
方式
重点强调:
Info.plist里有个View controller-based stats bar appearance
属性,没有可以自己添加,默认是YES
,表示通过方式一设置的UIStatusBarStyle优先级高于方式二,当设为NO
时反之。
2.3.1方式一详解
此时View controller-based stats bar appearance
值要为YES
,此值默认是YES
,Info.plist
没添加该属性时,即为YES
主要有五个方法,在ViewController
里重写即可。
//返回statusBarStyle
- (UIStatusBarStyle)preferredStatusBarStyle
//返回是否Hidden
- (BOOL)prefersStatusBarHidden
//更新statusBarStyle
- (void)setNeedsStatusBarAppearanceUpdate
//
- (nullable UIViewController *)childViewControllerForStatusBarStyle;
- (nullable UIViewController *)childViewControllerForStatusBarHidden;
这里说明一下setNeedsStatusBarAppearanceUpdate
和childViewControllerForStatusBarStyle
两个方法。
-
- (void)setNeedsStatusBarAppearanceUpdate
如果在viewController
已经显示在当前页面,你可能还要在当前页面不时的更改statusBar
的前景色,那么,你首先需要调用下面的setNeedsStatusBarAppearanceUpdate
方法(这个方法会通知系统去调用当前UIViewController
的preferredStatusBarStyle
方法),从而改变statusBar
的statusBarStyle
。
具体用法:
-(void)changeStatsBar {
_isChange = !_isChange;
[self setNeedsStatusBarAppearanceUpdate];
}
-(UIStatusBarStyle)preferredStatusBarStyle {
return _isChange?UIStatusBarStyleLightContent:UIStatusBarStyleDefault;
}
-
- (nullable UIViewController *)childViewControllerForStatusBarStyle;
这个接口也很重要,默认返回值为nil
。当我们调用setNeedsStatusBarAppearanceUpdate
时,系统会调用application.window
的rootViewController
的preferredStatusBarStyle
方法,我们的程序里一般都是用navigationController
做root
,如果是这种情况,那我们自己的viewController
里的preferredStatusBarStyle
根本不会被调用。这种情况下我们需要在navigationController
里重写该方法,返回当前正在显示的viewController
.
如:
-(nullable UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
这里再次强调一下:
当用navigationController
做root时,在viewController
里重写上述几个方法是无效的,如若单独改变某个viewController
的statusBarStyle
必须在navigationController
里重写childViewControllerForStatusBarStyle
方法实现
2.3.2方式二详解
首先设置View controller-based stats bar appearance
值为NO
,否则通过此方式设置的属性都不会生效。
在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法里设置相关属性方法开更改statusBar的style和hidden
@interface UIApplication(UIApplicationDeprecated)
// 显示设置statusBarOrientation
@property(readwrite, nonatomic) UIInterfaceOrientation statusBarOrientation;
- (void)setStatusBarOrientation:(UIInterfaceOrientation)interfaceOrientation animated:(BOOL)animated;
// 设置statusBarStyle
@property(readwrite, nonatomic) UIStatusBarStyle statusBarStyle;
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated;
//设置statusBarHidden
@property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden;
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation;
@end
通过UIApplication
的方式,我们发现在iOS9以后全部都废除了,看来苹果官方并不推荐我们这么做。UIApplication
的方式是一种全局控制,这样的方式也确实不怎么好。
3、更改UIStatusBar后景
3.1 默认方式
UIStatusBar
的背景默认会显示navigationBar
的背景或self.view
的背景。所以可以通过修改navigationBar
和self.view
的背景修改statusBar
的背景。
当有navigationBar时,通过下面两个方法修改:
setBarTintColor
- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics
关于navigationBar
背景颜色的问题,更加详细的内容可以参考IOS-UINavigationController详解没有
navigationBar
时,通过self.view.backgroundColor
修改。
3.2 KVO的方式修改
方法如下:
-(void)setStatusBarBackgroundColor:(UIColor *)color {
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
NSLog(@"statusBar.backgroundColor--->%@",statusBar.backgroundColor);
if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
statusBar.backgroundColor = color;
}
}
此方法修改过后,如无特别设置,其余所有的statusBar
都会该设置后的颜色。
3.3 UIView覆盖statusBar的方式
方法如下:
-(void)setStatusBarBackgroundColor:(UIColor *)color {
UIView * statusBarView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, -20)];
statusBarView.backgroundColor = [UIColor orangeColor];
[self.navigationController.navigationBar addSubview:statusBarView];
}
只修改当前navigationControlle
r的statusBar
。
参考文章:
ios上 更改 状态栏(UIStatusBar)的颜色,你值得一看、收藏
iOS7下隐藏status bar的详细研究
ios 状态栏statusBar的背景颜色