为啥 +[UIColor whiteColor] 不等于另一个白色?

Posted

技术标签:

【中文标题】为啥 +[UIColor whiteColor] 不等于另一个白色?【英文标题】:Why does +[UIColor whiteColor] not equal another white?为什么 +[UIColor whiteColor] 不等于另一个白色? 【发布时间】:2014-02-15 22:42:40 【问题描述】:

这真的很奇怪。将+[UIColor redColor] 与我自己创建的红色进行比较会得出相同的结果,但将+[UIColor whiteColor] 与另一个白色进行比较则不会。

// This test passes.
XCTAssertEqualObjects([UIColor redColor],
                      [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0],
                      @"Red should equal red.");

// While this test fails!
XCTAssertEqualObjects([UIColor whiteColor],
                      [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0],
                      @"White should equal white.");

虽然我正在扩展 UIColor 并添加一些有用的内容,但这个事实可能真的很烦人。

有人可以帮我解释一下吗?

【问题讨论】:

【参考方案1】:

UIColor”并不总是基于 RGBA 值。

UIColor 可以使用不同的颜色空间,例如 CMYK 颜色,对于白色,您可以通过[UIColor colorWithWhite:alpha:] 获得白色。

我怀疑在你的情况下[UIColor whiteColor] 将等于[UIColor colorWithWhite:1.0 alpha:1.0]

【讨论】:

哇,真的。 [UIColor colorWithWhite:1.0 alpha:1.0] 通过。 我可能会创建一个areComponentsEqual 实例方法,我可能就够了。 如果您想出一个可接受的“areComponentsEqual”方法,请告诉我。无论是在物理(现实)世界还是在设备上,配色都可能是一个相当大的挑战。 噢,我必须比较空间,阅读所有给定模型的文档以及它们如何使用组件... 文档强烈暗示情况确实如此:“返回一个 灰度值 为 1.0 的颜色对象...”(强调我的)。【参考方案2】:

一个可能的解释是不同颜色实例使用的颜色空间。白色可以在许多不同的域或空间中表示。如果颜色空间不相等,或者空间不容易转换到另一个空间(例如,将绝对表示转换为设备表示可能会导致信息丢失),则相等比较可能是负数。

颜色表示很复杂;准确的“比较”应该有多种方法来比较颜色,其中许多应该包括渲染目的地。

【讨论】:

【参考方案3】:

[UIColor whiteColor] 不生成 RGB 颜色空间对象——它在灰度颜色空间中。试试看

NSLog(@"color is %@", [UIColor whiteColor]);

很烦人。

当然,您可以制作 RGB 都等于 1.0 的白色,但它与 [UIColor whiteColor] 不是同一个颜色对象。

【讨论】:

【参考方案4】:

[UIColor whiteColor]UICachedDeviceWhiteColor 类型,而[UIColor colorWithRed:green:blue:alpha:] 在运行时返回UIDeviceRGBColor,因此它们不相等。

【讨论】:

以上是关于为啥 +[UIColor whiteColor] 不等于另一个白色?的主要内容,如果未能解决你的问题,请参考以下文章

为啥修饰符顺序在 SwiftUI 中很重要? [复制]

Swift - 为啥我在选择时无法更改色调?

更改 buttonImage 的 UIColor

UITextField:底部边框

更改导航栏中后退按钮的颜色

Swift开发教程--设置圆角Button和圆角边框TextView