【问题标题】:How to change the status bar style when a view controller is loading?加载视图控制器时如何更改状态栏样式?
【发布时间】:2018-09-19 08:15:17
【问题描述】:

我可以通过在 Info.plist 中将Status bar is initially hidden 设置为YES 来隐藏启动屏幕上的状态栏,然后我想在我的第一个具有.lightContent 样式的视图控制器上显示它。

但是 UIApplication.shared.statusBarStyle = .lightContent 自 iOS 9 以来已被弃用(所以我不想使用它)并且使用以下代码在我的第一个视图控制器上给我一个黑色状态栏。

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

如何在我的第一个视图控制器加载时更改状态栏样式?

我正在尝试寻找像UIApplication.shared.statusBarStyle = .lightContent 这样的全局解决方案,因为我真的不想为每个视图控制器设置状态栏样式。 我已经测试了将View controller-based status bar appearance 设置为YESNO 的解决方案。

【问题讨论】:

  • 已经尝试了所有解决方案,但我的状态栏保持黑色,我不想使用已弃用的解决方案。我也不确定“hack”解决方案是否好用。
  • 您的第一个视图控制器是否嵌套在 UINavigationController 中?众所周知,UINavgationController 不会向其 childController 询问 preferredStatusBarStyle 属性
  • @adrgrondin 在我的脑海中,一种方法是继承UINavigationController 并覆盖其preferredStatusBarStyle 属性以委托给topViewController。这不是最优雅的解决方案,但我现在能想到的唯一一个。
  • @Frederik 是正确的。只是要补充一点,您不需要子类UINavigationController 来实现这一点;您可以向UINavigationController 添加一个扩展名,它会覆盖prefersStatusBarHiddenpreferredStatusBarStyle。这应该可以正常工作(只要您在 info.plist 中将 View controller-based status bar appearance 设置为 YES)。

标签: ios iphone swift uikit


【解决方案1】:

您遇到的问题是UINavigationController 将状态栏的选择推迟到其视图控制器。

相反,对于导航控制器,可以通过调整其navigationBarbarStyle 属性来设置状态栏样式。

如果设置为黑色,则状态栏为浅色:

navigationController?.navigationBar.barStyle = .black

注意,这也会改变navigationBar 的颜色,但是您仍然可以使用barTintColor 将栏的颜色设置为您想要的任何颜色:

navigationController?.navigationBar.barTintColor = .purple

如果您想进行全局更改,以便UINavigationController所有 实例使用相同的状态栏样式(如果您有多个选项卡,所有这些选项卡都使用导航控制器,则很有用) ,然后您可以在UINavigationController 上添加扩展名并覆盖preferredStatusBarStyle 属性:

extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

最后一个选择是将选择推迟到导航控制器堆栈中的视图控制器。

为此,请覆盖导航控制器扩展的 childViewControllerForStatusBarStyle 属性并让它返回 topViewController

extension UINavigationController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return topViewController
    }
}

在这种情况下,您需要在所有视图控制器中覆盖 preferredStatusBarStyle(这不是最佳方法,但如果您需要在每个子控制器的基础上进行这种粒度级别的控制,这是一种选择)。

所有这些解决方案都要求将 Info.plist 中的 View controller-based status bar appearance 键设置为 YES

【讨论】:

  • 谢谢!成功了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 2014-02-08
相关资源
最近更新 更多