在 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
,然后返回 true
或 false
(基于按钮是否被点击)
当一个按钮被点击以强制改变状态栏时,我调用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中隐藏特定视图控制器的状态栏