prefersStatusBarHidden 没有被调用

prefersStatusBarHidden isn't getting called

我有一个标准的主从应用程序,我正在尝试有条件地 show/hide 状态栏。

在 MasterViewController 中覆盖 prefersStatusBarHidden() 没有任何作用。它甚至从未被调用。

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

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

我的目标是 iOS 9.

答案是从 window 的根视图控制器开始覆盖 prefersStatusBarHidden()。在主从应用程序中,这需要子类化 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()
}

有一个更简洁的解决方案。有一个函数 childViewControllerForStatusBarHidden 专门设计用于 return 应该将 prefersStatusBarHidden 转发到的 child 视图控制器。

所以,覆盖它会更好。它看起来像这样:

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() 它将发送到 child viewcontroller.

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

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

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

}