iOS上的statusBar
就是指的最上面的20像素高的部分,分为两个部分 - 前景部分:就是指显示信号、时间、电量等的状态部分 - 后景部分:就是显示黑色或者图片的背景部分
UIStatusBar
的前景部分实际就是通过UIStatusBarStyle
来修改,iOS7之后就两种style,
UIStatusBarStyleDefault
默认黑色字体 UIStatusBarStyleLightContent
白色字体
statusBarStyle
以及hidden
属性,Requires full screen
在支持分屏多任务时需要勾选。Info.plist处修改 **两处修改是同步的,修改其中一处,另一处会随之变化。 此处的修改只针对启动页有效,对viewController
不起作用。** 修改viewControlle
r的statusBar
有两种方式 - 方式一:通过viewController的-(UIStatusBarStyle)preferredStatusBarStyle
方法 - 方式二:通过UIapplication的
方式
重点强调: Info.plist里有个View controller-based stats bar appearance
属性,没有可以自己添加,默认是YES
,表示通过方式一设置的UIStatusBarStyle优先级高于方式二,当设为NO
时反之。
此时View controller-based stats bar appearance
值要为YES
,此值默认是YES
,Info.plist
没添加该属性时,即为YES
主要有五个方法,在ViewController
里重写即可。
这里说明一下setNeedsStatusBarAppearanceUpdate
和childViewControllerForStatusBarStyle
两个方法。 1. - (void)setNeedsStatusBarAppearanceUpdate
如果在viewController
已经显示在当前页面,你可能还要在当前页面不时的更改statusBar
的前景色,那么,你首先需要调用下面的setNeedsStatusBarAppearanceUpdate
方法(这个方法会通知系统去调用当前UIViewController
的preferredStatusBarStyle
方法),从而改变statusBar
的statusBarStyle
。 具体用法:
- (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
方法实现
首先设置View controller-based stats bar appearance
值为NO
,否则通过此方式设置的属性都不会生效。 在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法里设置相关属性方法开更改statusBar的style和hidden
通过UIApplication
的方式,我们发现在iOS9以后全部都废除了,看来苹果官方并不推荐我们这么做。UIApplication
的方式是一种全局控制,这样的方式也确实不怎么好。
UIStatusBar
的背景默认会显示navigationBar
的背景或self.view
的背景。所以可以通过修改navigationBar
和self.view
的背景修改statusBar
的背景。
当有navigationBar时,通过下面两个方法修改: setBarTintColor
- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics
关于navigationBar
背景颜色的问题,更加详细的内容可以参考IOS-UINavigationController详解
没有navigationBar
时,通过self.view.backgroundColor
修改。
方法如下:
-(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
都会该设置后的颜色。
方法如下:
-(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的背景颜色
新闻热点
疑难解答