【问题标题】:How to provide CGColor dynamically when switching dark/light mode?切换暗/亮模式时如何动态提供CGColor?
【发布时间】:2020-04-12 00:16:03
【问题描述】:

我在我的 Swift 应用程序中为 OS13 设置了一个动态的UIColors 来处理暗模式。

例如:

static var background: UIColor {
    if #available(iOS 13, *) {
        return UIColor { (traitCollection: UITraitCollection) -> UIColor in
            if traitCollection.userInterfaceStyle == .dark {
                return UIColor(hex: "2b2d42")
            } else {
                return UIColor(hex: "FFFFFF")
            }
        }
    } else {
        return UIColor(hex: "FFFFFF")
    }
}

在代码中的任何地方都使用CGColor 而不是UIColor 我打算像这样调用特定UIViewtraitCollectionDidChange,例如:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    layer.fillColor = color.cgColor
}

它可以工作,但我注意到的是,在更改设置中的模式后,如果我使用底部滑动手势切换回我的应用程序,那么我可以在传入屏幕上看到所有 UIColors 已经更新,但是CGColors 仅在应用实际进入前台并调用 traitCollectionDidChange 时才会更新。

有没有更好的方法来解决这个问题,以便CGColors 也立即更新?

【问题讨论】:

标签: ios swift ios-darkmode


【解决方案1】:

转到 Xcode > Assets.xcassets > new Color Set > 为 Light and Dark Appearance 设置颜色

现在在视图背景颜色中设置此颜色

self.view.backgroundColor = UIColor.init(named: "ColorForCameraScreen")

【讨论】:

  • 嗨!欢迎来到 StackOverflow!您可以使用formatting help 内联您的图片。
  • 我对徽标的颜色有疑问,背景设置正确,因为它使用 UIColor 和动态提供程序,问题在于颜色设置为 CGColor 而不是 @987654326 的徽标@
【解决方案2】:

很遗憾,是的,这是您唯一的选择。

CGColor 是一个 CoreGraphics 原语,一个普通的静态 C 结构,它不受益于新的 UIColor 动态功能。

但是,在最近的 iOS 版本中(我在 15.0 上进行测试),您的 CGColors 应该在 App Switcher 中正确更新。

您可以在this article by jessesquiresthis other answer 中找到更多详细信息。

我希望这个(迟到的)答案有助于阐明这一点。

【讨论】:

    猜你喜欢
    • 2020-10-20
    • 1970-01-01
    • 2021-03-05
    • 2022-01-10
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    相关资源
    最近更新 更多