UIView 中神秘的 UIColor 行为以及 Swift 中的一般行为

Kau*_*anu 2 uikit uiview uicolor swift swift-playground

最近我遇到了一个关于 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")
}
Run Code Online (Sandbox Code Playgroud)

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

let a = UIColor.systemBlue
to
let a = view.backgroundColor ?? .red
Run Code Online (Sandbox Code Playgroud)

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

fph*_*ipe 5

打印这两个值可以给你解释:

print(UIColor.systemBlue)

<UIDynamicSystemColor: 0x600000b47880;
  name = systemBlueColor
>
Run Code Online (Sandbox Code Playgroud)
print(view.backgroundColor!)

<UIDynamicModifiedColor: 0x60000058bed0;
  contrast = normal,
  baseColor = <UIDynamicSystemColor: 0x600000b47880;
    name = systemBlueColor
  >
>
Run Code Online (Sandbox Code Playgroud)

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

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

UIColor.systemBlue.resolvedColor(with: view.traitCollection) ==
  view.backgroundColor!.resolvedColor(with: view.traitCollection)
Run Code Online (Sandbox Code Playgroud)

解析的颜色是绝对颜色:

print(UIColor.systemBlue.resolvedColor(with: view.traitCollection))

UIExtendedSRGBColorSpace 0 0.478431 1 1
Run Code Online (Sandbox Code Playgroud)

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

来自以下文档UIColor.systemBlue

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

  • 请参阅 https://developer.apple.com/documentation/uikit/uitraitenvironment。对于一个简单的情况,请考虑深色模式,它会调整颜色以在不同模式下看起来更好。对于更复杂的情况,请参阅 https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_changing_display_modes_on_apple_tv (2认同)
  • 谢谢..只是看到固定颜色和自适应颜色之间的区别.. (2认同)