在 iOS 9 的一个视图控制器上隐藏状态栏

Posted

技术标签:

【中文标题】在 iOS 9 的一个视图控制器上隐藏状态栏【英文标题】:Hide statusbar on one viewcontroller for iOS 9 【发布时间】:2016-08-08 20:23:39 【问题描述】:

我有ViewController1,它使用segue 来显示ViewController2。它们都是 UINavigationController 的一部分。

我在ViewController2 上有一个按钮,它应该隐藏状态栏。

我查看了几个有关此问题的 *** 问题,发现以下问题,但仍然无法正常工作:

在 Info.plist 中将“查看基于控制器的状态栏外观”设置为 true

在 ViewController2 中,我添加了一个方法 override func prefersStatusBarHidden() -> Bool,然后返回 truefalse(基于按钮是否被点击)

当一个按钮被点击以强制改变状态栏时,我调用setNeedsStatusBarAppearanceUpdate

我读到了modalPresentationCapturesStatusBarAppearance(需要启用它)。我尝试在 ViewController2 上将其设置为 true prepareForSegue

但是,状态栏仍然显示,prefersStatusBarHidden 从未被调用过。

【问题讨论】:

【参考方案1】:

问题在于您的视图控制器位于 UINavigationController 接口中。因此,运行时向导航控制器咨询有关状态栏的信息,而不是您的视图控制器。

但是,导航控制器会依次咨询您的视图控制器,所以说 self.navigationController?.setNeedsStatusBarAppearanceUpdate() 就足够了。它对我来说很好用:

【讨论】:

知道了。解决方案应该是什么样的?我应该继承 UINavigationController 吗?我看到照片应用程序允许放大图片,这将隐藏一个状态栏(这个照片应用程序看起来也像使用导航控制器)。 self.navigationController?.setNeedsStatusBarAppearanceUpdate() 应该足够了。我是对的,这是一个 push segue 并且我们在一个导航控制器中吗?因为如果我错了,我们做了模态转场(所以这是一个呈现的视图控制器),情况就不同了。 是的。你说的对。它是导航控制器,它是一个推式转场。 只尝试我给出的代码,保留其余的代码,看看是否能解决问题。 我试过了。它仍然没有调用 prefersStatusBarHidden(并且状态栏没有隐藏)。【参考方案2】:

感谢马特的回答和Chris Hulbert's article about StatusBar 和这个SO question。

显然,您需要确保 ViewController 层次结构中的每个人都将 prefersStatusBarHidden 转发给适当的孩子。

有一些 ios 控制器可以做到这一点(例如 UINavigationViewController),而有些则没有(他们不知道应该将其转发给哪个控制器)。如果您有其中任何一个(例如 UISplitViewController),那么您需要对其进行子类化并覆盖 childViewControllerForStatusBarHidden 并编写代码以将其转发给适当的孩子。

【讨论】:

以上是关于在 iOS 9 的一个视图控制器上隐藏状态栏的主要内容,如果未能解决你的问题,请参考以下文章

如何使用objective-C在ios 9中隐藏特定视图控制器的状态栏

在所有视图控制器中隐藏状态栏 - IOS [重复]

ios隐藏状态栏后向下移动ui视图

仅在模态显示的视图控制器上隐藏状态栏

当“查看基于控制器的状态栏外观”=YES 时隐藏 ios 状态栏

在某些视图控制器中隐藏状态栏 *特定*