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

Posted

技术标签:

【中文标题】UIView 的神秘 UIColor 行为以及 Swift 中的一般行为【英文标题】:Mysterious UIColor behaviour with UIView and in General in Swift 【发布时间】:2019-12-22 15:57:38 【问题描述】:

最近我在 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

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

【问题讨论】:

您是否尝试过打印“a”以查看其内容? @DevKyle 是的,它是 systemBlue 颜色,UIColor 实例 【参考方案1】:

打印这两个值会给你解释:

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 等颜色是一种动态颜色,可能会产生不同的颜色,具体取决于视图的特性,其中包括高对比度模式和暗/亮模式等因素。

来自docs of UIColor.systemBlue

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

【讨论】:

谢谢,刚看到.. 但是.. 1. UIKit为什么要包装它?? 2.我们如何访问相同的baseColor进行比较? 3.什么是UIDynamicModifiedColor和UIDynamicSystemColor??任何参考都会非常有帮助。 :) 1.这是 UIKit 的实现细节。视图需要一种方法来保持设置的原始颜色并在特征发生变化时再次解决它。 2. 您可能只想将解析颜色与解析颜色以及动态颜色与动态颜色进行比较,其他任何事情都没有多大意义。 3. 这些是对消费者而言无关紧要的私有类。没有这些文档。 见developer.apple.com/documentation/uikit/uitraitenvironment。对于一个微不足道的情况,请考虑暗模式,它可以调整颜色以在不同模式下看起来更好。更复杂的情况见developer.apple.com/documentation/uikit/app_and_environment/… 谢谢.. 只是看到固定颜色和自适应颜色之间的区别..

以上是关于UIView 的神秘 UIColor 行为以及 Swift 中的一般行为的主要内容,如果未能解决你的问题,请参考以下文章

从 viewController 更改 UIColor 以在 UIView 类中使用

从 UIColor 属性设置 UIView 的 backgroundColor 的问题

UIView alpha与UIColor alpha

带有图案图像和颜色的 UIColor

iOS为UIView的子类添加渐变颜色

神秘的角度行为 - 有些表单在输入时提交,有些则没有