StatusBarStyle

使用 - preferredStatusBarStyle

plist的View controller-based status bar appearance 默认是YES。 表示view controller中对status bar的设置优先级高于application的设置。

单viewController的情况

- (UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleLightContent; //UIStatusBarStyleDefault
}

navigationController viewcontroller受navigationController管理的情况,可以直接设置颜色或者交给viewcontroller管理:

- (UIStatusBarStyle)preferredStatusBarStyle{    
    return [self.viewControllers.lastObject preferredStatusBarStyle];
}

如何动态改变:

调用[self setNeedsStatusBarAppearanceUpdate]; 举例:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle{
    _flag = !_flag;   
    return _flag ? UIStatusBarStyleDefault : UIStatusBarStyleLightContent;
}

问题 有人说这个方法配合setNavigationBarHidden:animated:一起使用会有问题:滑动一半再送手会出现导航条消失。 个人尝试并没有出现问题。

代码如下:

//vc1
- (UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleLightContent; //UIStatusBarStyleDefault
}
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:animated];
}

//vc2
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:animated];
}
- (UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleDefault;
}

使用[UIApplication sharedApplication].statusBarStyle

这算是iOS9以前的常用做法 。

plist的View controller-based status bar appearance 默认是YES,这时候[UIApplication sharedApplication].statusBarStyle不生效了。

要用的话手动修改它为NO.

statusBar背景色

使用kvc,比较简单:

//设置状态栏颜色
- (void)setStatusBarBackgroundColor:(UIColor *)color {
    UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
    if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
        statusBar.backgroundColor = color;
    }
}

但是需要谨慎。 iPhoneX statusbar不知道改名了没有。目前还没有测试。