用 isEqual 比较两种颜色时的奇怪结果
Weird result when comparing two colors with isEqual
我正在尝试比较两种颜色,但无法得到正确的结果:
这是我的代码:
NSLog(@"selfColor = %@",selfColor);
NSLog(@"left = %@",left);
NSLog(@"[selfColor isEqual:left] = %@",[selfColor isEqual:left] ? @"TRUE":@"FALSE");
这是我的调试日志:
2016-01-05 16:58:24.050 breakout[84467:11799727] selfColor = UIDeviceRGBColorSpace 0.333333 0.333333 0.333333 1
2016-01-05 16:58:24.050 breakout[84467:11799727] left = UIDeviceRGBColorSpace 0.333333 0.333333 0.333333 1
2016-01-05 16:58:24.050 breakout[84467:11799727] [selfColor isEqual:left] = FALSE
两种颜色相同,但 isEqual: 函数仍然 return false...我错过了什么?
感谢您的帮助
编辑:
颜色是通过此函数从 another SO question
生成的
BOOL isEqualToColor(UIColor *left, UIColor *right) {
CGColorSpaceRef colorSpaceRGB = CGColorSpaceCreateDeviceRGB();
UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) {
if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) == kCGColorSpaceModelMonochrome) {
const CGFloat *oldComponents = CGColorGetComponents(color.CGColor);
CGFloat components[4] = {oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]};
CGColorRef colorRef = CGColorCreate( colorSpaceRGB, components );
UIColor *color = [UIColor colorWithCGColor:colorRef];
CGColorRelease(colorRef);
return color;
} else
return color;
};
UIColor *selfColor = convertColorToRGBSpace(right);
left = convertColorToRGBSpace(left);
CGColorSpaceRelease(colorSpaceRGB);
NSLog(@"selfColor = %@",selfColor);
NSLog(@"left = %@",left);
NSLog(@"[selfColor isEqual:left] = %@",[selfColor isEqual:left] ? @"TRUE":@"FALSE");
return [selfColor isEqual:left];
}
我这样称呼它:
if (isEqualToColor(node.color,[UIColor darkGrayColor])) {...}
这是一种比较颜色的方法
-(BOOL)isColor:(UIColor *)first similarToColor:(UIColor *)second {
float tolerance = 0.01; // 1%
CGColorRef firstColor = [first CGColor];
CGColorRef secondColor = [second CGColor];
if (CGColorGetColorSpace(firstColor) != CGColorGetColorSpace(secondColor)) {
return FALSE;
}
NSUInteger componentCount = CGColorGetNumberOfComponents(firstColor);
const CGFloat *leftComponents = CGColorGetComponents(firstColor);
const CGFloat *rightComponents = CGColorGetComponents(secondColor);
for (int i = 0; i < componentCount; i++) {
float difference = leftComponents[i] / rightComponents[i];
if (fabs(difference - 1) > tolerance) {
return FALSE;
}
}
return TRUE;
}
并拨打电话
[self isColor:selfColor similarToColor:left];
如果您希望测试更准确或更不准确,您可以更改 tolerance
值
我正在尝试比较两种颜色,但无法得到正确的结果:
这是我的代码:
NSLog(@"selfColor = %@",selfColor);
NSLog(@"left = %@",left);
NSLog(@"[selfColor isEqual:left] = %@",[selfColor isEqual:left] ? @"TRUE":@"FALSE");
这是我的调试日志:
2016-01-05 16:58:24.050 breakout[84467:11799727] selfColor = UIDeviceRGBColorSpace 0.333333 0.333333 0.333333 1
2016-01-05 16:58:24.050 breakout[84467:11799727] left = UIDeviceRGBColorSpace 0.333333 0.333333 0.333333 1
2016-01-05 16:58:24.050 breakout[84467:11799727] [selfColor isEqual:left] = FALSE
两种颜色相同,但 isEqual: 函数仍然 return false...我错过了什么?
感谢您的帮助
编辑:
颜色是通过此函数从 another SO question
生成的BOOL isEqualToColor(UIColor *left, UIColor *right) {
CGColorSpaceRef colorSpaceRGB = CGColorSpaceCreateDeviceRGB();
UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) {
if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) == kCGColorSpaceModelMonochrome) {
const CGFloat *oldComponents = CGColorGetComponents(color.CGColor);
CGFloat components[4] = {oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]};
CGColorRef colorRef = CGColorCreate( colorSpaceRGB, components );
UIColor *color = [UIColor colorWithCGColor:colorRef];
CGColorRelease(colorRef);
return color;
} else
return color;
};
UIColor *selfColor = convertColorToRGBSpace(right);
left = convertColorToRGBSpace(left);
CGColorSpaceRelease(colorSpaceRGB);
NSLog(@"selfColor = %@",selfColor);
NSLog(@"left = %@",left);
NSLog(@"[selfColor isEqual:left] = %@",[selfColor isEqual:left] ? @"TRUE":@"FALSE");
return [selfColor isEqual:left];
}
我这样称呼它:
if (isEqualToColor(node.color,[UIColor darkGrayColor])) {...}
这是一种比较颜色的方法
-(BOOL)isColor:(UIColor *)first similarToColor:(UIColor *)second {
float tolerance = 0.01; // 1%
CGColorRef firstColor = [first CGColor];
CGColorRef secondColor = [second CGColor];
if (CGColorGetColorSpace(firstColor) != CGColorGetColorSpace(secondColor)) {
return FALSE;
}
NSUInteger componentCount = CGColorGetNumberOfComponents(firstColor);
const CGFloat *leftComponents = CGColorGetComponents(firstColor);
const CGFloat *rightComponents = CGColorGetComponents(secondColor);
for (int i = 0; i < componentCount; i++) {
float difference = leftComponents[i] / rightComponents[i];
if (fabs(difference - 1) > tolerance) {
return FALSE;
}
}
return TRUE;
}
并拨打电话
[self isColor:selfColor similarToColor:left];
如果您希望测试更准确或更不准确,您可以更改 tolerance
值