prefersStatusBarHidden没有被调用

时间:2016-02-27 14:10:13

标签: ios uinavigationcontroller uisplitviewcontroller

我有一个标准的Master-Detail应用程序,我试图有条件地显示/隐藏状态栏。

在MasterViewController中覆盖prefersStatusBarHidden()不执行任何操作。它甚至都没有被召唤。

override func prefersStatusBarHidden() -> Bool {
    return true
}

在Info.plist中设置UIViewControllerBasedStatusBarAppearance并没有帮助,大概是因为YES已经是默认值。致电setNeedsStatusBarAppearanceUpdate()也无济于事。

我的目标是iOS 9。

3 个答案:

答案 0 :(得分:4)

有一点清洁解决方案。有一个函数childViewControllerForStatusBarHidden,专门用于返回一个子视图控制器,prefersStatusBarHidden应转发给它。

因此,覆盖它会更好。它看起来像这样:

override func childViewControllerForStatusBarHidden() -> UIViewController? {
    if var topViewController = self.viewControllers.first {
        if let navigationController = topViewController as? UINavigationController {
            topViewController = navigationController.topViewController!
        }
        return topViewController
    }

    return super.childViewControllerForStatusBarHidden()
}

可能你甚至可以省略以下内容。 NavigationViewController上有自己的childViewControllerForStatusBarHidden(),它将把它发送给子视图控制器。

  if let navigationController = topViewController as? UINavigationController {
      topViewController = navigationController.topViewController!
  }

答案 1 :(得分:2)

答案是从窗口的根视图控制器开始覆盖prefersStatusBarHidden()。在Master-Detail应用程序中,这需要子类化UISplitViewController以将消息转发到视图控制器层次结构中。

这样的事情:

override func prefersStatusBarHidden() -> Bool {
    if var topViewController = self.viewControllers.first {
        if let navigationController = topViewController as? UINavigationController {
            topViewController = navigationController.topViewController!
        }
        return topViewController.prefersStatusBarHidden()
    }

    return super.prefersStatusBarHidden()
}

答案 2 :(得分:0)

如果您对所有拆分视图控制器都做得很好,那么这对我有用:

extension UISplitViewController {
    override open var childForStatusBarHidden: UIViewController? {
        return (viewControllers.last as? UINavigationController)?.visibleViewController
}

}