2009-10-20 114 views
6

我试图用Objective-C编写的代码来确定两种颜色是否相同。比较Objective-C中的颜色

我使用这个代码片段,以确定是否这两种颜色是等价的(目前用于调试)

NSLog(@"currentColor is %@", currentColor); 
NSLog(@"Adjacent Color is %@",[[buttonArray objectAtIndex:1] backgroundColor]); 
NSLog(@"%i",[[buttonArray objectAtIndex:1] backgroundColor]==currentColor); 

我的控制台显示

2009-10-20 00:27:10.814 colorGame[13588:207] currentColor is kCGColorSpaceModelRGB 0 0 1 1 
2009-10-20 00:27:10.815 colorGame[13588:207] Adjacent Color is kCGColorSpaceModelRGB 0 0 1 1 
2009-10-20 00:27:10.815 colorGame[13588:207] 0 

,如果我可以发布更多的代码问(我不知道是否还有其他需要)。当前颜色最初定义为

UIColor *currentColor; 

如果这是任何帮助。

我很确定我只是在做比较错误,并且可能有一些内置方法可以比较颜色,我只是不知道。

+0

这个问题应该改写为“比较Objective-C中的对象”,因为事实证明它与颜色无关。 – nschmidt 2009-10-20 07:44:55

回答

11

对象必须使用isEqual:方法,不==,它只是比较指针地址

+1

我想你的意思是isEqual: – nall 2009-10-20 07:39:44

+0

谢谢!我只是修改我的代码来比较字符串输出,而不是颜色本身,一路上使用isEqual。现在精美的作品。谢谢! – sshaukat 2009-10-20 07:46:20

1

您正在测试的对象指针的等价性,这可能是永远不会返回true进行比较。如果你想使用实际的颜色值,那么你需要得到底层的CGColor参考。

17
@implementation UIColor (compare) 

- (BOOL) isEqualToColor:(UIColor *) otherColor 
{ 
return CGColorEqualToColor(self.CGColor, otherColor.CGColor); 
} 

@end 

请记住,这看起来是一样的五月或两种颜色可能不会返回TRUE,因为部件保持为浮动,他们可以通过使用小于显示硬件可以解决值不同。

另请注意,如果它们在不同的色彩空间中定义,则此方法永远不会返回TRUE。

+0

我刚刚遇到了两个UIColors具有相同值组件并且处于相同颜色空间但在[UIColor isEqual:]工作时CGColorEqualToColor返回值不相等的情况,是否有某些我丢失? – 2014-04-27 18:16:24