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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: ios user-interface ios9 statusbar


    【解决方案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 并编写代码以将其转发给适当的孩子。

    【讨论】:

      猜你喜欢
      • 2016-05-03
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 2016-04-23
      • 2017-06-23
      • 2013-01-11
      相关资源
      最近更新 更多