Ios 将状态栏设置为灯光内容并动态显示/隐藏(带UINAVIGATIONCONTROLLER的UITabBarController)

Ios 将状态栏设置为灯光内容并动态显示/隐藏(带UINAVIGATIONCONTROLLER的UITabBarController),ios,iphone,swift,xcode,Ios,Iphone,Swift,Xcode,我有一个UITabBarController作为根视图控制器。每个选项卡都有一个嵌入在导航控制器中的视图控制器。我的导航栏是深色的,所以我需要将状态栏设置为.lightContent。我还需要动态隐藏状态栏 如果我将“基于视图控制器的状态栏外观”设置为“否”,我可以将状态栏正确设置为“.lightContent”,但我无法动态隐藏状态栏 如果我将“基于视图控制器的状态栏外观”设置为“是”,则仅当导航栏不存在时,状态栏才会设置为“.lightContent” 这是我在每个视图控制器中用于显示或隐藏

我有一个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 }
我也尝试过:

navigationController?.navigationBar.barStyle=.black


要将状态栏设置为.lightContent,并且仍然能够动态显示和隐藏状态栏,我必须缺少某些内容。

导致使用不推荐的方法:

UIApplication.shared.setStatusBarHidden(true, with: .slide)

不是很理想,但很有效。希望有人能在不依赖已弃用方法的情况下找到解决方案。

导致使用已弃用方法:

UIApplication.shared.setStatusBarHidden(true, with: .slide)

不是很理想,但很有效。希望有人能找到一个不依赖不推荐的方法的解决方案。

您必须通过视图层次结构将这些值冒泡起来。例如,您的
tabBarController
应该询问它的
selectedViewController
它的
prefersStatusBarHidden
值是多少,然后您的
navigationController
需要询问它的
topViewController
它的
prefersStatusBarHidden
值是多少。这样,当在
选项卡BarController
上调用
prefersStatusBarHidden
时,它会传回最顶层的视图控制器想要对状态栏执行的操作。

您必须在视图层次结构中向上冒泡这些值。例如,您的
tabBarController
应该询问它的
selectedViewController
它的
prefersStatusBarHidden
值是多少,然后您的
navigationController
需要询问它的
topViewController
它的
prefersStatusBarHidden
值是多少。这样,当在
选项卡barcontroller
上调用
prefersStatusBarHidden
时,它会将最顶端的视图控制器想要对状态栏执行的操作传递回来