将状态栏设置为轻量级内容并动态显示/隐藏(UITabBar控制器与UINavigationControllers)



我有一个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时,它会中继回最顶层视图控制器想要对状态栏执行的操作。

最新更新