【问题标题】:prefersStatusBarHidden isn't getting calledprefersStatusBarHidden 没有被调用
【发布时间】:2016-06-10 19:02:00
【问题描述】:

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

在 MasterViewController 中覆盖 prefersStatusBarHidden() 什么都不做。它甚至永远不会被调用。

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

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

我的目标是 iOS 9。

【问题讨论】:

    标签: ios uinavigationcontroller uisplitviewcontroller


    【解决方案1】:

    有一点更清洁的解决方案。有一个函数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()。在 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()
      }
      

      【讨论】:

        【解决方案3】:

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

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

        }

        【讨论】:

          猜你喜欢
          • 2016-02-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-09
          • 1970-01-01
          • 2011-11-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多