【问题标题】:Status Bar appearance not working as it should - with iOS 13 Dark Mode状态栏外观无法正常工作 - 使用 iOS 13 暗模式
【发布时间】:2019-11-25 07:19:50
【问题描述】:

我的应用程序使用defaultstatus 栏样式用于登录前屏幕。 - 登录后,应用程序使用lightContent 样式作为整个应用程序的状态栏。

在 iOS 12 之前一切正常。它开始在 iOS 13 上产生问题(仅在启用深色模式时)

这是我已经尝试过的东西,但仍然无法正常工作。

  • 我确实将UIUserInterfaceStyle 设置为Light
  • 我确实将UIViewControllerBasedStatusBarAppearance 设置为YES
  • 然后我在单个视图控制器中尝试了以下代码

override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }

  • 还在类文件的viewDidLoad() 中添加了这一行。

setNeedsStatusBarAppearanceUpdate()

但是,我仍然没有摆脱这个与状态栏相关的东西。我只需要在登录前让我的状态栏在屏幕上变暗,一旦用户登录,它就会亮起。

整个应用程序在深色和浅色模式下都应该具有相同的 UI。 (与 iOS 13 以下的操作系统一样)目前运行良好,但只有状态栏在改变颜色。

注意:禁用深色模式后一切正常。这仅在启用深色模式时才会产生问题。

据我了解,我在 Xcode 中创建了一个新项目,并添加了 3 个具有不同状态栏外观的屏幕。

一个可行的案例
VC1 - Default 风格
VC2 - Default 风格
VC3 - LightContent 风格

一个可行的案例
VC1 - LightContent 风格
VC2 - LightContent 风格
VC3 - Default 风格

不工作(失败)案例
VC1 - Default 风格
VC2 - LightContent 风格
VC3 - Default 风格

我的假设是 - 如果您在应用程序中使用任何一种样式,无论设备的深色或浅色模式如何,它都能正常工作。但是,如果您在应用中将DefaultLightContent 结合起来作为状态栏的外观,那么在启用暗模式时它不会按预期工作。

谁能帮我解决状态栏样式的这种行为?

这是我的三个视图控制器文件。它只是将一个控制器推到另一个控制器上。这是我上面提到的演示项目的文件。其中有失败案例。

暗模式关闭时:即使我在 VC2 中覆盖状态栏样式,我也总是得到default 状态栏样式。
暗模式关闭时: 即使我在 VC1 和 VC3 中覆盖状态栏样式,我总是得到lightContent 状态栏样式。

这是我的 info.plist 文件

【问题讨论】:

    标签: swift statusbar ios-darkmode


    【解决方案1】:

    在您的情况下,导航控制器负责维护状态栏样式。因此,您需要继承您的导航控制器并覆盖它的preferredStatusBarStyle。

    【讨论】:

      【解决方案2】:

      如果您不想在应用中支持暗模式(并且您似乎需要固定的灯光和默认配色方案),那么您可以在 Info.plist 中通过设置完全退出它 UIUserInterfaceStyle 到亮或暗或在每个单独的视图控制器上你可以override var overrideUserInterfaceStyle: UIUserInterfaceStyle { get { .light } set { //you can leave this empty } }

      编辑:

      要仅更改状态栏外观而不使用 darkMode 执行任何操作,您可以在 Info.plist 中选择退出黑暗模式,然后添加值为 YES 的 UIUserInterfaceStyle 并在每个 viewController 中您想要不同的状态栏样式,您需要覆盖首选的状态栏外观像这样的属性:

       override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      } 
      

      最后你在 viewDidLoad() 中调用 setNeedsStatusBarAppearanceUpdate()

      编辑2:

      如果在导航控制器中,您需要在自定义导航控制器类中设置上述内容,如下所示:

      import UIKit
      
      class Navi: UINavigationController {
      
          public var requiredStatusBarStyle: UIStatusBarStyle = .lightContent {
              didSet {
                  setNeedsStatusBarAppearanceUpdate()
              }
          }
          override func viewDidLoad() {
              super.viewDidLoad()
              // Do any additional setup after loading the view.
          }
      
          override var preferredStatusBarStyle: UIStatusBarStyle {
                  requiredStatusBarStyle
          }
      
      }
      

      然后在每个 VC 中你可以设置 viewDidAppear 属性:

       if let navi = navigationController as? Navi {
                  navi.requiredStatusBarStyle = .darkContent
              }
      

      如果你不想在明暗之间出现剧烈的跳跃,你可以在 setneedsstatusbarupdate 周围包裹一个 uiview 动画

      public var requiredStatusBarStyle: UIStatusBarStyle = .lightContent {
              didSet {
                  UIView.animate(withDuration: 0.5) {
                      self.setNeedsStatusBarAppearanceUpdate()
                  }
              }
          }
      

      【讨论】:

      • 感谢您的回复。您的解决方案是在深色主题中更改我的整个视图控制器。我只需要更改状态栏颜色,而不是其他 UI 元素颜色。应用需要在深色和浅色两种模式下相同,
      • 然后正如我提到的,通过将 Info.plist 属性更改为 light 来退出暗模式,然后添加值为 YES 的 UIViewControllerBasedStatusBarAppearance。在您的视图控制器中,您可以像override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } 那样覆盖preferredStatusbarAppearance var,并且不要忘记在viewDidLoad 中调用setNeedsStatusBarAppearanceUpdate()
      • 感谢您为此问题所做的努力。我更新了我的问题并添加了我的 ViewController 和 Info.plist 文件的屏幕截图。我正在按照你的建议做。但这不起作用。
      • 您的代码没有显示控制器之间的关系,即它们是如何呈现的?如果您有一个带有导航控制器的故事板,那么您需要创建一个继承自 UINavigationController 的新类并覆盖其中的上述属性并调用setNeedsStatusBarAppearanceUpdate()。您可以添加一个公共函数来将外观设置为您需要的任何外观,并从推送的 VC1/2/3 中调用它,并将所需的暗/亮样式作为参数。
      【解决方案3】:

      请尝试一次使用此

      controller.navigationController?.navigationBar.isTranslucent = false
      

      因为在我的情况下它有效。

      【讨论】:

      • 感谢您的回复。我试过你的解决方案。但是,当暗模式打开时,我没有得到default 状态栏样式。它始终显示lightContent 状态栏。我什至在 info.plist 文件中添加了User Interface Style 键,值为Light。还是没有运气!
      • 状态栏是您拥有电池、运营商时钟等的地方,而不是导航栏。
      【解决方案4】:

      您可以在项目设置的常规中设置默认状态栏样式。

      【讨论】:

      • 我设置了默认样式。但我想在整个应用程序的不同屏幕上使用不同的样式。所以我想这不会有帮助。
      猜你喜欢
      • 2021-11-21
      • 2020-01-14
      • 1970-01-01
      • 2015-12-07
      • 2016-09-06
      • 2020-01-29
      • 1970-01-01
      • 2020-02-10
      相关资源
      最近更新 更多