prefersStatusBarHidden方法没有被调用

4

我有一个标准的主从应用程序,并且我正在尝试有条件地显示/隐藏状态栏。

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

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

在 Info.plist 中设置 UIViewControllerBasedStatusBarAppearance 是没有帮助的,可能是因为 YES 已经是默认值了。调用 setNeedsStatusBarAppearanceUpdate() 也没有帮助。

我正在针对 iOS 9 进行开发。

3个回答

5

有一个更简洁的解决方案。有一个函数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!
  }

2
答案是从窗口的根视图控制器开始重写 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()
}

0
如果你愿意为所有的分屏视图控制器都这样做,那么这个方法对我来说是有效的:
extension UISplitViewController {
    override open var childForStatusBarHidden: UIViewController? {
        return (viewControllers.last as? UINavigationController)?.visibleViewController
}

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接