首页 > 解决方案 > 如何正确获取和设置 UIView 的 UIColor?

问题描述

我正在尝试根据其当前颜色更改UIViewa 。backgroundColor例如说 MyView 现在是红色的,触摸时我想让它变成蓝色,反之亦然。但我注意到我无法获得正确的名称UIColor来检查当前颜色。

例如,如果我这样做:

if MyView.backgroundColor == .systemRed {
        print("Red")
    } else {
        print("Not red")
    }

这将始终打印“非红色”,即使我明确设置MyView.backgroundColor = .systemRed

当我检查正在使用的颜色时:

print("Color = \(MyView.backgroundColor)")

它打印:[...] name = systemRedColor

但是当我更改.systemRed为时.systemRedColor,它给出了错误

'systemRedColor' has been renamed to 'systemRed'

我又回到了我开始的地方。

谁能告诉我我错过了什么?如何正确读取和设置backgroundColorof UIView

标签: iosswiftuicolor

解决方案


.systemRed是动态系统颜色之一,将根据视图的当前特征条件(即暗模式/亮模式)以不同方式显示。因此,您需要使用该.resolvedColor(with traitCollection:)功能访问当前颜色。

Light Mode 下systemRed将显示为: UIExtendedSRGBColorSpace 1 0.231373 0.188235 1 R255 G59 B48

深色模式下systemRed将显示为: UIExtendedSRGBColorSpace 1 0.270588 0.227451 1 R255 G69 B58

if view.backgroundColor?.resolvedColor(with: view.traitCollection) == UIColor.systemRed.resolvedColor(with: view.traitCollection) {
    print("true")
}

这将适用于动态和标准UIColor的。


你也可以做一个扩展UIColor来做到这一点

extension UIColor {
    class func compare(_ colorA: UIColor?, with colorB: UIColor?, in view: UIView) -> Bool {
        colorA?.resolvedColor(with: view.traitCollection) == colorB?.resolvedColor(with: view.traitCollection)
    }
}

用法:

if UIColor.compare(self.view.backgroundColor, with: .systemRed, in: view) {
    print("true")
}

推荐阅读