ios - 用 isEqual 比较两种颜色时的奇怪结果

标签 ios comparison uicolor

我正在尝试比较两种颜色,但无法得到正确的结果:

这是我的代码:

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: 函数仍然返回 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

关于ios - 用 isEqual 比较两种颜色时的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34615991/

相关文章:

ios - 我如何告诉我的应用程序准确读取字符串包含的内容?

ios - 这个多态性的例子是错误的吗?

c# - Protocol Buffer 与 JSON 或 BSON

swift - Swift 中#function 和#selector 的不同结果

ios - 解析本地数据存储性能

ios - 目录名称无效 - 您的应用程序包含已保留的目录名称

Java 不等于字符串语法不起作用

ios - 为什么我不能将颜色数组中的颜色随机设置到 tableViewCells?

iphone - 使用 UIView 动画处理一系列动画的最佳方式

swift - 如何在 UIColor 中使用变量?