【问题标题】:iOS: Default status bar style with UIViewControllerBasedStatusBarAppearance YESiOS:带有 UIViewControllerBasedStatusBarAppearance YES 的默认状态栏样式
【发布时间】:2017-01-27 14:12:56
【问题描述】:

有没有办法在启用UIViewControllerBasedStatusBarAppearance 的同时设置默认状态栏样式?

这是我正在处理的问题:

几乎整个应用都需要使用UIStatusBarStyle.LightContent,因为导航栏的背景是深色的。原来UIViewControllerBasedStatusBarAppearance是禁用的,在Info.plist中设置了如下的while文本状态栏:

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

这工作得很好,直到我发现这个 .LightContent 状态栏甚至对于某些共享扩展程序(如 Facebook Messenger)也会显示,导致它不可读:

这可以通过使用UIViewControllerBasedStatusBarAppearance 来解决,但是我需要将以下方法添加到我想避免的所有视图控制器中,因为应用程序非常大。

此外,对于应用程序中具有浅色导航栏背景的一个屏幕,我使用 UIApplication.sharedApplication().setStatusBarStyle() 切换到深色导航栏,但这种方法在 iOS 9 中已弃用。

任何想法如何解决这个问题?晕眩?

【问题讨论】:

  • 我做了一个解决方法并使用这行代码来更新状态栏颜色:`self.navigationController?.navigationBar.barStyle = UIBarStyle.black` 你想将它设置为UIBarStyle.default 我想
  • 我想到的一个可能的解决方法(未测试)是,不是将该方法添加到所有视图控制器,而是为 ViewController 类编写一个包含该方法的扩展。

标签: ios uiappearance ios7-statusbar


【解决方案1】:

解决方案

实现这一点的最简单和最简洁的方法是在AppDelegateapplication:willFinishLaunchingWithOptions 方法中添加以下行:

UINavigationBar.appearance().barStyle = .Black

只要您的应用使用UINavigationController,这将使.LightContent成为整个应用的默认状态栏样式。

如果想在启动时使用.LightContent 状态栏样式作为初始屏幕,请不要忘记在应用程序的Info.plist 中保留以下设置:

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

TL;DR

我当前的设置与许多其他应用程序非常相似,使用UITabBarController 作为最顶层的控制器,每个选项卡都有UINavigationController 堆栈。

UINavigationController 负责状态栏样式(应该如此),并且不要在其子视图控制器上调用 preferredStatusBarStyle()。因此,在我的情况下,实现subclassing solution proposed by par 不起作用。

进一步继承UINavigationController I'm using 的自定义子类也不是一个干净的解决方案。

现在,由于该应用程序已启用UIViewControllerBasedStatusBarAppearance 并且在应用程序本身的任何地方都具有正确的状态栏样式,SFSafariViewController 和消息、邮件等共享扩展程序也使用正确的 (.Default) 状态栏样式。

未使用正确状态栏样式的唯一例外是问题中提到的 Facebook Messenger 的共享扩展。但是,这似乎是扩展程序本身的一个错误,因为我尝试过的所有使用 .LightContent 状态栏样式的应用程序(例如 Twitter)都有相同的问题 - 来自应用程序的 FB Messenger 共享扩展程序有一个状态栏带有白色文字。

【讨论】:

    【解决方案2】:

    我经常使用的一个解决方案是创建一个基本视图控制器类,我的应用程序中的所有视图控制器都从该类派生。这样做的好处是允许将基于视图控制器的状态栏样式设置功能与默认(浅色或深色)样式一起使用,然后可以根据需要在每个视图控制器的基础上对其进行覆盖。

    一旦您开始了解基于 trait-collection 的更改、大多数视图控制器想要的自定义过渡动画、分析跟踪的中心点以及其他有用的东西,基本视图控制器也非常方便。

    是的,您必须检查您可能庞大的源库并将您所有的 UIViewControllers 更改为 BaseViewControllers,但这通常与全局搜索和替换一样简单。

    下面是BaseViewController 与状态栏相关方法的样子:

    class BaseViewController: UIViewController {
        var statusBarHidden: Bool = false { didSet { setNeedsStatusBarAppearanceUpdate() } }
        var statusBarStyle: UIStatusBarStyle = .lightContent { didSet { setNeedsStatusBarAppearanceUpdate() } }
        var statusBarUpdateAnimation: UIStatusBarAnimation = .fade { didSet { setNeedsStatusBarAppearanceUpdate() } }
    
        override var preferredStatusBarStyle: UIStatusBarStyle { return statusBarStyle }
        override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return statusBarUpdateAnimation }
        override var prefersStatusBarHidden: Bool { return statusBarHidden }
    }
    

    对于所有使用默认灯光样式的视图控制器,你不需要做任何特别的事情:

    class ViewController: BaseViewController { }
    

    如果您需要深色状态栏,请执行以下操作:

    class DarkStatusBarViewController: BaseViewController {
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
    
            statusBarStyle = .default
        }
    }
    

    另请注意,当您需要深色状态栏时,您可以将上面的 DarkStatusBarViewController 重命名为 DarkStatusBarBaseViewController 并从中派生而不是 BaseViewController。然后,您无需在每个需要它的视图控制器中复制状态条码,并且为您的所有 BaseViewController 功能保持良好的线性关系。

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 2016-12-11
      • 2013-10-13
      相关资源
      最近更新 更多