状态栏可以通过UIApplication类提供的一些方法来修改
比如完全去掉状态栏或者修改风格,这些改变只是在程序内部,当退出程序又会复原
参考文章 iOS状态栏操作
参考文章 iOS状态栏和导航栏的控制问题 *
参考文章 定制iOS 7中的导航栏和状态栏 *
参考文章 ios上更改状态栏(UIStatusBar)的颜色
参考文章 在iOS7中修改状态栏字体的颜色
- 是否显示网络活动(等待)标志
[UIApplication sharedApplication].networkActivityIndicatorVisible
- 获取状态栏的信息
[UIApplication sharedApplication].statusBarFrame;
控制状态栏
对状态栏的控制分两种情况:全局设置和分页面设置。
控制这两种模式的开关是 info.plist 文件的 View controller-based status bar appearance 配置项。
全局设置状态栏
将 info.plist 文件的 View controller-based status bar appearance 设置为 NO,即可开启全局设置,
也就是说你在视图控制器中对状态栏的控制都将无效,相比之下,是通过下面的代码来全局控制:(可能已弃用)
// 设置状态栏的字体颜色模式
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
// 设置状态栏是否隐藏
[[UIApplication sharedApplication] setStatusBarHidden:YES];
注意
我们并不能对状态栏的字体颜色做任意的控制,只有两种选择UIStatusBarStyleDefault和UIStatusBarStyleLightContent,前者是默认的黑色,而后者是白色。也就是说如果你的背景色是偏深色,那么设置状态栏的字体颜色为白色。另外,我们可以全局设置状态栏是否显示,但是一般而言app不会对所有界面都不显示状态栏,而是只在特定的页面需要隐藏状态栏,比如对于视频播放界面不希望显示状态栏。
对于状态栏的背景色设置,上面提到从iOS7开始状态栏本身实际上是透明的,它的背景色其实取决于导航栏的背景色。
分页面设置状态栏
将 info.plist 文件的 View controller-based status bar appearance 设置为 YES ,即可开启由视图控制器来控制状态栏的功能,在这种模式下,全局的设置将无效!!所以我们必须逐个页面对状态栏进行设置,否则状态栏将维持默认的黑色字体和默认为显示状态。
字体设置
对于设置状态栏字体颜色,分两种情况:视图控制器是否属于UINavigationController中:
当视图控制器不在UINavigationController中时,在VC中添加一个方法
- (UIStatusBarStyle)preferredStatusBarStyle { //返回白色 return UIStatusBarStyleLightContent; //返回黑色 //return UIStatusBarStyleDefault; }
保险起见,在view的某个加载阶段比如viewWillAppear中,执行:
[self setNeedsStatusBarAppearanceUpdate];
当视图控制器在UINavigationController中时,VC并不能通过方式1控制状态栏的颜色,详见本文后面的参考资料,那么这个时候,有一个trick的方法可以在VC中间接的控制:
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
隐藏控制
对于控制状态栏的隐藏同样存在VC是否是根控制器的问题,也就说只有根控制器才能直接控制状态栏的显示与否。
如果是VC本身就是根控制器,那么在VC中添加如下代码:
- (BOOL)prefersStatusBarHidden { return YES; }
当然,保险起见,在适当的时候调用
[self setNeedsStatusBarAppearanceUpdate];
如果VC不是根控制器,那么不像控制字体颜色那样有trick,我们只能间接的通过在子VC中控制根VC,从而间接控制根控制器。那么这个方法就很多了,比如我的根VC是个tab的VC,首先现在tab的VC中,实现1:
@interface YYCTabBarController : RDVTabBarController
//定义一个变量来控制状态栏显示,子VC通过修改这个值来间接控制
@property (nonatomic,assign)BOOL statusBarHidden;
@end
@implementation YYCTabBarController
- (BOOL)prefersStatusBarHidden {
return _statusBarHidden;
}
@end
在子VC中:
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
// rdv_tabBarController指向YYCTabBarController
if([self.rdv_tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
[self.rdv_tabBarController performSelector:@selector(setStatusBarHidden:) withObject:@(YES)];
[self setNeedsStatusBarAppearanceUpdate];
}
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
if([self.rdv_tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
// 注意对NO的情况,不能传@NO,只能传nil才能被当成NO
[self.rdv_tabBarController performSelector:@selector(setStatusBarHidden:) withObject:nil];
[self setNeedsStatusBarAppearanceUpdate];
}
}
可以看到在子VC中通过设置根VC的属性,并调用setNeedsStatusBarAppearanceUpdate后,根VC的prefersStatusBarHidden就会被调用,从而隐藏或显示状态栏。