设置状态栏的背景色及前景色(iOS)
知识普及:
iOS上,状态栏就是指的最上面的20像素高的部分
背景色:默认透明色;
前景色:就是指的显示电池、时间等部分,默认黑色;
如下图,背景色为黑色,前景色为白色
状态栏.png
一、设置背景色
默认情况下状态栏的背景色是透明的(苹果推荐),我们看到其实导航栏的背景色,如果非要改状态栏背景色的话也是有办法的:
//设置状态栏背景色
- (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;
}
}
![](https://img.haomeiwen.com/i2096141/a3f94ae515b74058.png)
二、设置前景色(两类办法)
(1)在plist文件中,把View controller-based status bar appearance设置为NO。然后写如下代码:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
或
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
(2)在plist文件中,把View controller-based status bar appearance设置为YES。然后写如下代码:
//plist中 View controller-based status bar appearance 设为YES 才有用
// 状态栏文字黑色 UIBarStyleDefault
// 状态栏文字白色 UIBarStyleBlack
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
或
//在需要的控制器里面重写这个方法
- (UIStatusBarStyle)preferredStatusBarStyle{
//黑色:UIStatusBarStyleDefault
return UIStatusBarStyleLightContent;//白色
}
ps:
运行会发现这个方法根本没被调用,因为系统会调用container(容器控制器)的preferredStatusBarStyle这个方法(app.window.rootViewController的preferred的方法,一般我们用UINavigationController或者UITabBarController来做container),也就是根本不会调用子控制器(我们所看到的UIViewcontroller)的preferredStatusBarStyle方法。这个时候- (UIViewController *)childViewControllerForStatusBarStyle:就派上用场了。
写一个UINavigationController的类别 .m如下:
#import "UINavigationController+CY.h"
@implementation UINavigationController (CY)
-(UIViewController *)childViewControllerForStatusBarStyle{
//当前显示的控制器
// return self.topViewController;
//是某个导航栈的栈顶视图
return self.visibleViewController;
}
-(UIViewController *)childViewControllerForStatusBarHidden{
return self.visibleViewController;
}
@end
这下再运行发现就好了。
ps:
该类扩展的意思就是,我重写了,你不要调用Container(NavigationController或者UITabBarController)的preferredStatusBarStyle这个方法了,去调用self.visibleViewController的preferredStatusBarStyle,那么,我们写在UIViewcontroller里面的方法就会被调用了,就能更改StatusBar的前景颜色了。
参考:https://www.cnblogs.com/ilovelqq/p/4769655.html