Ios 首选StatusBarHidden isn';我没接到电话
我有一个标准的Master-Detail应用程序,我正在尝试有条件地显示/隐藏状态栏 在MasterViewController中重写Ios 首选StatusBarHidden isn';我没接到电话,ios,uinavigationcontroller,uisplitviewcontroller,Ios,Uinavigationcontroller,Uisplitviewcontroller,我有一个标准的Master-Detail应用程序,我正在尝试有条件地显示/隐藏状态栏 在MasterViewController中重写prefersStatusBarHidden(),没有任何作用。它甚至从未被呼叫过 override func prefersStatusBarHidden() -> Bool { return true } 在Info.plist中设置UIViewControllerBasedStatusBarAppearance,可能没有帮助,因为YES已经是
prefersStatusBarHidden()
,没有任何作用。它甚至从未被呼叫过
override func prefersStatusBarHidden() -> Bool {
return true
}
在Info.plist中设置UIViewControllerBasedStatusBarAppearance
,可能没有帮助,因为YES
已经是默认值。调用setNeedsStatusBarAppearanceUpdate()
也没有帮助
我的目标是iOS 9。答案是从窗口的根视图控制器开始覆盖
首选StatusBarHidden()
。在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()
}
override func childViewControllerForStatusBarHidden() -> UIViewController? {
if var topViewController = self.viewControllers.first {
if let navigationController = topViewController as? UINavigationController {
topViewController = navigationController.topViewController!
}
return topViewController
}
return super.childViewControllerForStatusBarHidden()
}
有一个稍微干净一点的解决方案。有一个函数
childViewControllerForStatusBarHidden
,专门用于返回应转发prefersStatusBarHidden的子视图控制器
因此,最好覆盖它。它将如下所示:
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()
}
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(),它会将其发送给子viewcontroller
if let navigationController = topViewController as? UINavigationController {
topViewController = navigationController.topViewController!
}
如果对所有拆分视图控制器都适用,那么这对我很有用:
extension UISplitViewController {
override open var childForStatusBarHidden: UIViewController? {
return (viewControllers.last as? UINavigationController)?.visibleViewController
}
}