iOS上的statusBar就是指的最上面的20像素高的部分,分为两个部分 - 前景部分:就是指显示信号、时间、电量等的状态部分 - 后景部分:就是显示黑色或者图片的背景部分
UIStatusBar的前景部分实际就是通过UIStatusBarStyle来修改,iOS7之后就两种style,
UIStatusBarStyleDefault 默认黑色字体 UIStatusBarStyleLightContent 白色字体
此处可设置启动页的statusBarStyle以及hidden属性,Requires full screen在支持分屏多任务时需要勾选。Info.plist处修改
**两处修改是同步的,修改其中一处,另一处会随之变化。 此处的修改只针对启动页有效,对viewController不起作用。** 修改viewController的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];}只修改当前navigationController的statusBar。
参考文章: ios上 更改 状态栏(UIStatusBar)的颜色,你值得一看、收藏 iOS7下隐藏status bar的详细研究 ios 状态栏statusBar的背景颜色
新闻热点
疑难解答