我有 ViewController1
使用segue来显示 ViewController2
. 它们都是UINavigationController的一部分 .
我在 ViewController2
上有一个按钮,它应该隐藏状态栏 .
我经历了几个关于此问题的Stackoverflow问题并发现了以下内容,但仍无法使其正常工作:
-
在Info.plist中设置"View controller-based status bar appearance"为
true
-
在ViewController2中我添加了一个方法
override func prefersStatusBarHidden() -> Bool
并返回true
或false
(根据是否单击了按钮) -
当点击一个按钮强制状态栏更改时,我调用
setNeedsStatusBarAppearanceUpdate
. -
我读到了
modalPresentationCapturesStatusBarAppearance
(需要启用它) . 我试图在ViewController2上将其设置为true
prepareForSegue
但是,状态栏仍然显示,并且从未调用过preStatusBarHidden .
2 回答
问题是您的视图控制器位于UINavigationController接口中 . 因此,运行时会向状态栏咨询导航控制器,而不是视图控制器 .
但是,导航控制器将咨询您的视图控制器,因此应该足够说
self.navigationController?.setNeedsStatusBarAppearanceUpdate()
来设置球滚动 . 这对我来说可以:感谢matt的回答和Chris Hulbert's article about StatusBar以及SO question .
显然,您需要确保ViewController层次结构中的每个人都将
prefersStatusBarHidden
转发给适当的子级 .有一些iOS控制器可以做到这一点(例如UINavigationViewController),还有一些没有(他们不知道应该转发哪一个) . 如果您有任何一个(例如UISplitViewController),那么您需要对其进行子类化并覆盖childViewControllerForStatusBarHidden并编写代码以将其转发给适当的子级 .