statusBar的Style状态分两种:
(1)默认的黑色:UIStatusBarStyleDefault
(2)白色:UIStatusBarStyleLightContent
statusBar设置Style地方:
(1)plist设置statusBar:
在plist文件中里增加一行 UIStatusBarStyle(或“Status bar style”),
这里可以设置两个值: UIStatusBarStyleDefault
和 UIStatusBarStyleLightContent。
设置后在app启动的launch页显示的时候,statusBar的样式就是plist设置的风格。
(2)程序代码中设置
代码中设置又分两种形式
(a)UIApplication:(对所有视图,一次性修改)
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
(b)preferredStatusBarStyle(对单个视图,修改某个视图的statusBarStyle)
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
以上方式修改状态栏必须和 UIViewControllerBasedStatusBarAppearance 配合使用,不然statusBar还是默认黑色,并没有改变。
在plist中设置键值对(默认值是YES)
当UIViewControllerBasedStatusBarAppearance = NO时:
UIApplication 的setStatusBarStyle方法生效:
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
viewController的preferredStatusBarStyle方法失效
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
UIViewControllerBasedStatusBarAppearance = YES时:
UIApplication 的setStatusBarStyle无效;
viewController的preferredStatusBarStyle方法有效。
注意: 将UIViewControllerBasedStatusBarAppearance设置为YES,当self.window.rootViewController是一个导航时,我们发现,viewController的preferredStatusBarStyle方法还是没有效果,这需要我们类化一个UINavigationController,在这个子类里面重写childViewControllerForStatusBarStyle方法
例:
@interface ZYNavVC ()
@end
@implementation ZYNavVC
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.topViewController;
}
这样就可以单独改变每个子视图的statusBar的颜色了。
有时会遇到这种需求,触发某个事件(点击一个按钮),在某个界面中不时地改变statusBar的状态,只是就要用到setNeedsStatusBarAppearanceUpdate了。
@interface ViewController ()
@property(nonatomic,assign)UIStatusBarStyle statusBarStyle;
@end
@implementation ViewController
-(UIStatusBarStyle)preferredStatusBarStyle
{
return self.statusBarStyle;
}
-(void)statusBarChangeTarget:(UIButton *)sender
{
sender.selected = !sender.selected;
if (sender.selected)
{
self.statusBarStyle = UIStatusBarStyleDefault;
}
else
{
self.statusBarStyle = UIStatusBarStyleLightContent;
}
[self setNeedsStatusBarAppearanceUpdate];
}
当视图是presentViewController 出来的时候,那就要modalPresentationCapturesStatusBarAppearance上场了。
设置modalPresentationCapturesStatusBarAppearance = YES;
//This controls whether this view controller takes over control of the status bar's appearance when presented non-full screen on another view controller. Defaults to NO.(它控制这个视图控制器在另一个视图控制器上显示非全屏时是否接管状态栏的外观。默认为没有。)
就可以控制里面导航栏状态的变化了。
UIViewController *presentVC = [UIViewController new];
presentVC.modalPresentationCapturesStatusBarAppearance = YES;