神秘的 UIColor 行为与 UIView 和一般在 Swift 中



最近我在 Swift 中遇到了一个关于 UIColor 的有趣(可能是幼稚的(问题。

import UIKit
let view = UIView(frame: CGRect(x: 0,
y: 0,
width: 50,
height: 50))
view.backgroundColor = .systemBlue
let a = UIColor.systemBlue
switch a {
case .red:
print("red")
case .systemBlue:
print("blue")
default:
print("unknown")
}

以下代码在操场上打印"蓝色"非常好,但会发生变化

let a = UIColor.systemBlue
to
let a = view.backgroundColor ?? .red

在操场上打印"未知",有人可以帮忙这里发生了什么吗?我无法解决它。.它是否与某个时候的值类型或引用类型相关?请帮忙!!

打印这两个值给出了解释:

print(UIColor.systemBlue)
<UIDynamicSystemColor: 0x600000b47880;
name = systemBlueColor
>
print(view.backgroundColor!)
<UIDynamicModifiedColor: 0x60000058bed0;
contrast = normal,
baseColor = <UIDynamicSystemColor: 0x600000b47880;
name = systemBlueColor
>
>

设置backgroundColor属性时,UIKit 将颜色包装在私有类UIDynamicModifiedColor中。

如果使用视图的特征比较解析的颜色,则会得到true

UIColor.systemBlue.resolvedColor(with: view.traitCollection) ==
view.backgroundColor!.resolvedColor(with: view.traitCollection)

解析的颜色是绝对颜色:

print(UIColor.systemBlue.resolvedColor(with: view.traitCollection))
UIExtendedSRGBColorSpace 0 0.478431 1 1

颜色(如UIColor.systemBlue(是一种动态颜色,可能会导致不同的颜色,具体取决于视图的特征,其中包括高对比度模式和深/亮模式等因素。

来自UIColor.systemBlue的文档:

自动适应当前特征环境的蓝色。

最新更新