iOS状态栏相关操作

499 阅读2分钟

状态栏是一件很坑爹的事情,一不弄不好就会出现你不想要的结果。

修改状态栏的颜色

iOS 9

修改状态栏的颜色在 iOS 9 之前我们会这样做:

  • 首先在.plist文件中设置 UIViewControllerBasedStatusBarAppearanced 的值为NO。
  • 然后通过以下代码去控制状态栏的颜色
+ (void)statusBarColorWhite:(BOOL)isWhite
{
    [[UIApplication sharedApplication] setStatusBarStyle:isWhite ? UIStatusBarStyleLightContent : UIStatusBarStyleDefault];
}

这种方式操作起来比较简便。

iOS 9 之后

在 iOS 9 之后上面的方式已经被遗弃了。虽然还可以用,但是会出现一个warnning,一个黄色的感叹号会使我们这些有强迫症患者的人感到非常难受,尽管我的工程中已经有536个warnning了。
新的方法比较麻烦,但还是有道可循的。下面就是我总结的方法:

  • 首先,你要自己判断当前的 viewController 是否有 navigationController。
  • 如果当前 viewController 不在 navigationController 中。
    这时,要修改状态栏的颜色只需要在这个viewController中重写 - (UIStatusBarStyle)preferredStatusBarStyle 即可。
    - (UIStatusBarStyle)preferredStatusBarStyle
    {
        return UIStatusBarStyleDefault/UIStatusBarStyleLightContent;
    }
    
  • 如果当前 viewController navigationController中。
    这时,要修改状态栏颜色就不能用上边的方法了。因为你试过后就会发现这种情况下你在进入 viewController 的过程中并没有进入到 preferredStatusBarStyle 方法里面去。下面是可行的方法:
    • 如果要设置整个 navigationController,即整个 navigationController 的状态栏颜色都是统一的,要在 navigationController 中去重写 - (UIStatusBarStyle)preferredStatusBarStyle
    • 如果要单独设置某个 viewController 的状态栏颜色,那么就需要在 viewController 的 viewWillAppear 中去设置:
      - (void)viewWillAppear:(BOOL)animated
      {
          [super viewWillAppear:animated];
          self.navigationController.navigationBar.barStyle = UIStatusBarStyleDefault;//设置状态栏为黑色
          self.navigationController.navigationBar.barStyle = UIStatusBarStyleLightContent;//设置状态栏为白色
          
      }
      

设置隐藏、显示状态栏

  • 如果你在 .plist 文件中设置了 UIViewControllerBasedStatusBarAppearanced 为NO。那么你需要使用以下方法来设置:
    [[UIApplication sharedApplication] setStatusBarStyle:(UIStatusBarStyle)];
    
    这种设置方法是全局设置的,如果在某特定页面隐藏了状态栏,在需要显示的地方就要再设置一次显示状态栏。
    这种方法会有一个warnning。 这种设置方式可能会导致一个系统导航栏飞出屏幕之外的Bug。(别问我为什么知道...)
  • 如果你没有在 .plist 文件中设置 UIViewControllerBasedStatusBarAppearanced 为NO。那么要在 viewController 中重写 prefersStatusBarHidden 来进行设置:
    - (BOOL)prefersStatusBarHidden {
        return YES;
    }
    

小结:以上两种操作中都同意使用第二种方法会更省事。