【问题标题】:Dark mode don't update instantly暗模式不会立即更新
【发布时间】:2019-12-06 09:02:55
【问题描述】:

我在我的 iOS 应用程序中实现了dark mode,虽然它有效,但更改不会立即发生。我认为这与views 没有像android 那样一直在重建自己有关。

例如,从应用程序中退出,然后进入设置并更改主题,然后再次返回应用程序是行不通的。这些更改仅发生在与 Apple 相关的框架上,例如 alertControllers。要让dark mode 工作,我必须点击新的view,然后再回到旧的view

我曾尝试在委托中添加dark mode 代码,因为我认为这会在您每次重新进入应用程序时运行,但事实并非如此。

那么,关于如何使这项工作发挥作用的任何想法?例如,每次我重新进入应用程序时都会运行一个委托,或者我可以让 dark mode 更改的观察者吗?

【问题讨论】:

    标签: ios ios-darkmode


    【解决方案1】:

    你可以实现这个方法来“监听” TraitCollection 的变化:

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        // do whatever you want to do 
    }
    

    另外,正如 Gergely 所提到的,尝试将 xcassets 用于颜色和图像,以便它们根据当前的 TraitCollection 动态变化。

    【讨论】:

    • 我可以在委托中使用它,这样我只需要实现一次,还是需要在每个视图中都有这个代码?
    • 我猜这真的取决于您的需求。如果您使用 xcassets,我认为只有几件事需要手动调整。或者你想出一个聪明的方法来为所有控制器实现这个(比如添加一个 BaseViewController 等)
    • 如果您只使用图像/颜色资产而不是硬编码它们,则根本不需要使用它。非常简单直观的方法,可以让您的应用很好地响应屏幕变化,
    • @GergelyKovacs 我认为这并不总是可能的。例如,我们在我们的应用程序中使用 GoogleMap,并为明暗模式提供自定义样式。例如,对于这个用例,我们需要在 TraitCollection 更改时应用新的 mapStyle。但在大多数情况下,我认为你是对的。
    • @Teetz 你是对的;在极少数情况下你需要这个。我也必须使用 traitCollectionDidChange,因为我在某些不会动态更新的地方使用 CALayers。但在大多数情况下,整个暗模式支持可以通过简单的颜色/图像资源来完成,而无需编写任何代码。
    【解决方案2】:

    警报视图控制器会更新,因为它们使用响应式系统颜色作为其文本和背景,默认情况下具有浅色和深色模式的版本,并在模式更改后自动更新。

    如果您使用颜色和图像资源,您可以对自定义视图执行相同的操作。这是对如何做事的一个很好的概述:Medium Article

    Apple 官方文档也对如何支持暗模式进行了很好的概述:Supporting Dark Mode in Your Interface

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-08
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多