为啥 +[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] 不等于另一个白色?的主要内容,如果未能解决你的问题,请参考以下文章