我有一个标准的Master-Detail应用程序,我试图有条件地显示/隐藏状态栏。
在MasterViewController中覆盖prefersStatusBarHidden()
不执行任何操作。它甚至都没有被召唤。
override func prefersStatusBarHidden() -> Bool {
return true
}
在Info.plist中设置UIViewControllerBasedStatusBarAppearance
并没有帮助,大概是因为YES
已经是默认值。致电setNeedsStatusBarAppearanceUpdate()
也无济于事。
我的目标是iOS 9。
答案 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
}
}