这真的很奇怪。将+[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
,但这一事实可能真的很烦人。
有人能为我阐明这一点吗?
"UIColor
" 并不总是基于 RGBA 值。
UIColor 可以使用不同的颜色空间,例如 CMYK 颜色,如果是白色,您可以通过 [UIColor colorWithWhite:alpha:]
获得白色。
我怀疑在你的情况下[UIColor whiteColor]
会等于[UIColor colorWithWhite:1.0 alpha:1.0]
.
一种可能的解释是不同颜色实例使用的颜色空间。白色可以在许多不同的域或空间中表示。如果颜色空间不相等,或者如果空间不容易转换为另一个空间(例如,将绝对表示转换为设备表示可能会导致信息丢失),则相等比较可能是负的。
颜色表示很复杂;准确的"比较"需要多种方法来比较颜色,许多方法应该包括渲染目标。
[UIColor whiteColor] 不生成 RGB 颜色空间对象 - 它位于灰度颜色空间中。 尝试
NSLog(@"color is %@", [UIColor whiteColor]);
很烦人。
当然,您可以使 RGB 都等于 1.0 的白色,但它与 [UIColor whiteColor] 不是同一个颜色对象。
[UIColor whiteColor]
的类型是UICachedDeviceWhiteColor
,而[UIColor colorWithRed:green:blue:alpha:]
在运行时返回UIDeviceRGBColor
,因此它们不相等。