我有一个UITabBarController作为根视图控制器。每个选项卡都有一个嵌入在导航控制器内的视图控制器。我的导航栏是深色的,所以我需要将状态栏设置为 .lightContent。我还需要动态隐藏状态栏。
如果我将">基于视图控制器的状态栏外观"设置为"否",我可以将状态栏正确设置为".lightContent",但无法动态隐藏状态栏。
如果我将">基于视图控制器的状态栏外观"设置为"是",则状态栏将仅在导航栏不存在的情况下设置为".lightContent"。
这是我在每个视图控制器中用于显示或隐藏状态栏的内容:
var shouldHideStatusBar: Bool = false {
didSet { self.setNeedsStatusBarAppearanceUpdate() }
}
override var prefersStatusBarHidden: Bool { return shouldHideStatusBar }
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return .slide }
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
我也尝试过:
导航控制器?。导航栏.条形图样式 = .黑色
为了将状态栏设置为 .lightContent,并且仍然能够动态显示和隐藏状态栏,我必须缺少一些东西。
导致使用已弃用的方法:
UIApplication.shared.setStatusBarHidden(true, with: .slide)
不理想,但有效。希望有人有一个解决方案,而不依赖于已弃用的方法。
您必须在视图层次结构中向上冒泡这些值。例如,你的tabBarController
应该问它的selectedViewController
它对prefersStatusBarHidden
的价值是什么,然后你的navigationController
需要问它的topViewController
它对prefersStatusBarHidden
的价值是什么。这样,当在tabBarController
上调用prefersStatusBarHidden
时,它会中继回最顶层视图控制器想要对状态栏执行的操作。