首页 文章

将状态栏设置为浅色内容并动态显示/隐藏(带UINavigationControllers的UITabBarController)

提问于
浏览
1

我有一个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,并仍然能够动态显示和隐藏状态栏 .

2 回答

  • 0

    导致使用弃用的方法:

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

    不理想,但有效 . 希望有人有一个解决方案,而不依赖于弃用的方法 .

  • 0

    您必须通过视图层次结构向上冒泡这些值 . 例如,您的 tabBarController 应该询问 selectedViewController 它的 prefersStatusBarHidden 的值是什么,那么 navigationController 需要询问 topViewController prefersStatusBarHidden 的值是什么 . 这样,当在 tabBarController 上调用 prefersStatusBarHidden 时,它会回传最顶层视图控制器想要对状态栏执行的操作 .

相关问题