iOS StatusBar 的坑应该都在这儿了

从 iOS 7 起,Apple 就一直在 UIStatusBar 上折腾,感觉每个版本都在更新 API。
最近一个项目也需要折腾 StatusBar,躲不过,只能正面迎敌!

显示/隐藏 StatusBar

原来觉得显示隐藏 StatusBar 是一件很简单的事情,却没想到掉进一个大坑里。
大坑在另外一篇文章里说吧,这里主要讲 StatusBar 的定制。iOS Adjust Scroll View Insets 补坑之路

全局隐藏 StatusBar

如果要全局隐藏 StatusBar,做以下两个设置即可

  • Info 中 [View controller-based status bar appearance] 设置为 NO
  • General-Deployment Info 中勾选 [Hide stauts bar]

动态显示/隐藏 StatusBar

  • Info 中 [View controller-based status bar appearance] 设置为 YES(这个属性默认为 YES,所以也可以不去配置)
  • override prefersStatusBarHidden 方法

参考下面的代码,在不同时间点调整 StatusBar 的显示与隐藏

iOS StatusBar 的坑应该都在这儿了_第1张图片
动态调整 StatusBar 的显示与隐藏

还是无法隐藏 StatusBar?

我想你一定是 present 了一个 ViewController,所以请在 viewDidLoad 方法中设置 self.modalPresentationCapturesStatusBarAppearance = true 试看看,具体原因,看这个方法的描述就很清楚了

调整 StatusBar 的样式(黑或白)

如果要动态定制 StatusBar 的样式,

  • Info 中 [View controller-based status bar appearance] 设置为 YES
  • 在 ViewController 中 viewDidLoad 调用 self.setNeedsStatusBarAppearanceUpdate()
  • 在 ViewController 中 override preferredStatusBarStyle 返回你需要的样式

但是这样绝大部分都是无法生效的,具体原因看文末的链接,我就不摘抄了

解决方案有两个:

方案一

设置 Navigation Bar 的 Style。这样,所有该 NavigationController 下的 ViewController 的 StatusBar 样式都将统一

iOS StatusBar 的坑应该都在这儿了_第2张图片
设置 Navigation Bar 的 Style

方案二

新建一个类继承 NavigationController ,override childViewControllerForStatusBarStyle 返回 self.topViewController

参考链接:

iOS Status Bar 状态栏相关知识
设置app的状态栏样式

你可能感兴趣的:(iOS StatusBar 的坑应该都在这儿了)