加载视图控制器时如何更改状态栏样式?

adr*_*din 2 iphone uikit ios swift

我能够通过设置启动屏幕上的状态栏隐藏Status bar is initially hidden,以YES在Info.plist中,然后我想表明它与我的第一个视图控制器上.lightContent的风格。

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

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}
Run Code Online (Sandbox Code Playgroud)

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

我试图找到一个全局解决方案,UIApplication.shared.statusBarStyle = .lightContent因为我真的不想为每个视图控制器设置状态栏样式。我已经使用View controller-based status bar appearanceset toYES和测试了解决方案NO

Pet*_*ris 6

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

相反,对于导航控制器,可以通过调整barStylenavigationBar.

如果设置为黑色样式,则状态栏将是浅色样式:

navigationController?.navigationBar.barStyle = .black
Run Code Online (Sandbox Code Playgroud)

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

navigationController?.navigationBar.barTintColor = .purple
Run Code Online (Sandbox Code Playgroud)

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

extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

extension UINavigationController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return topViewController
    }
}
Run Code Online (Sandbox Code Playgroud)

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

所有这些解决方案都要求您将View controller-based status bar appearanceInfo.plist中的密钥设置为YES.