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

时间:2014-02-15 22:42:41

标签: ios cocoa-touch uikit equality uicolor

这真的很奇怪。将+[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,但这个事实真的很烦人。

有人可以为我阐明这个吗?

4 个答案:

答案 0 :(得分:5)

UIColor”并非始终基于RGBA值。

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

我怀疑你的案件[UIColor whiteColor]将等于[UIColor colorWithWhite:1.0 alpha:1.0]

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

[UIColor whiteColor]不会产生RGB色彩空间对象 - 它位于灰度色彩空间中。试试

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

非常讨厌。

当然,您可以使RGB等于1.0的白色,但它与[UIColor whiteColor]颜色对象不同。

答案 3 :(得分:0)

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