如何正确获取和设置 UIView 的 UIColor?

How to correctly get and set UIColor for UIView?

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

举个例子,如果我这样做:

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

这将始终打印 "Not red",即使我明确设置 MyView.backgroundColor = .systemRed

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

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

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

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

'systemRedColor' has been renamed to 'systemRed'

我又回到了起点。

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

.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")
}

你可以试试这个。

self.bgView.backgroundColor = UIColor.red
 print("self.bgView.backgroundColor")

   if self.bgView.backgroundColor!.isEqual(UIColor.red){
      print("Red")
   } else {
   print("No Red")
 }
 print(self.bgView.backgroundColor)

//它会打印红色