【问题标题】: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
}
}