如何在iOS中比较两个具有几乎相同阴影或范围的UIColor?

时间:2014-02-07 07:50:17

标签: ios objective-c uicolor color-scheme cgcolor

我的应用程序中有一个条件,用户可以选择3种颜色,但这些颜色不应该相互匹配,问题是用户可以从托盘中为所有3个字段选择相似的颜色。

我正在尝试下面的代码,这里color2的颜色与color1略有不同: -

UIColor *color1 = [UIColor colorWithRed:1 green:(CGFloat)0.4 blue:1 alpha:1];
UIColor *color2 = [UIColor colorWithRed:1 green:(CGFloat)0.2 blue:1 alpha:1];

 if ([color1 isEqual:color2]) {
        NSLog(@"equals");
    }else {
        NSLog(@"not equal");
    }

输出:'不相等' 这是正确的逻辑,因为它比较RGB值,但我想检查它的范围,让我知道是否有人知道如何比较相似的颜色。

5 个答案:

答案 0 :(得分:32)

您需要一个容差,其价值只有您可以决定:

- (BOOL)color:(UIColor *)color1
isEqualToColor:(UIColor *)color2
withTolerance:(CGFloat)tolerance {

    CGFloat r1, g1, b1, a1, r2, g2, b2, a2;
    [color1 getRed:&r1 green:&g1 blue:&b1 alpha:&a1];
    [color2 getRed:&r2 green:&g2 blue:&b2 alpha:&a2];
    return
        fabs(r1 - r2) <= tolerance &&
        fabs(g1 - g2) <= tolerance &&
        fabs(b1 - b2) <= tolerance &&
        fabs(a1 - a2) <= tolerance;
}

...

UIColor *color1 = [UIColor colorWithRed:1 green:(CGFloat)0.4 blue:1 alpha:1];
UIColor *color2 = [UIColor colorWithRed:1 green:(CGFloat)0.2 blue:1 alpha:1];

if ([self color:color1 isEqualToColor:color2 withTolerance:0.2]) {
    NSLog(@"equals");
} else {
    NSLog(@"not equal");
}

答案 1 :(得分:10)

trojanfoe 的答案很棒,这是一个Swift版本:

我的建议:在UIColor上创建一个扩展名,如下所示:

public extension UIColor{

    func isEqualToColor(color: UIColor, withTolerance tolerance: CGFloat = 0.0) -> Bool{

        var r1 : CGFloat = 0
        var g1 : CGFloat = 0
        var b1 : CGFloat = 0
        var a1 : CGFloat = 0
        var r2 : CGFloat = 0
        var g2 : CGFloat = 0
        var b2 : CGFloat = 0
        var a2 : CGFloat = 0

        self.getRed(&r1, green: &g1, blue: &b1, alpha: &a1)
        color.getRed(&r2, green: &g2, blue: &b2, alpha: &a2)

        return
            fabs(r1 - r2) <= tolerance &&
            fabs(g1 - g2) <= tolerance &&
            fabs(b1 - b2) <= tolerance &&
            fabs(a1 - a2) <= tolerance
    }

}

用法:

// check if label's color is white
if label.textColor.isEqualToColor(UIColor.whiteColor(), /* optional */ withTolerance: 0.0){
    // if so, add shadow
    label.layer.shadowColor = UIColor.blackColor().CGColor
    label.layer.shadowRadius = 4.0
    label.layer.shadowOpacity = 0.6
    label.layer.shadowOffset = CGSizeMake(0, 0)
}

答案 2 :(得分:9)

您也可以使用此功能。

UIColor *color1 = [UIColor colorWithRed:1 green:(CGFloat)0.4 blue:1 alpha:1];
UIColor *color2 = [UIColor colorWithRed:1 green:(CGFloat)0.2 blue:1 alpha:1];

if (CGColorEqualToColor(color1.CGColor,color2.CGColor))
{
    //Two colors are same
}

答案 3 :(得分:2)

如果我清楚地理解:

CGFloat *components1 = CGColorGetComponents([[UIColor color1] CGColor]);
CGFloat *component1 = CGColorGetComponents([[UIColor color2] CGColor]);

然后,您可以使用components[0](红色),components[1](绿色),components[2](蓝色)和components[3] alpha来比较两种颜色之间的差异。 决定你想要比较的东西。示例: fabs(components1[1]-components2[1]),或所有这些差异之间的平均值等。

答案 4 :(得分:1)

通过传递isEqualTo:值来初始化UIColor实例

float

UIColor *color1 = [UIColor colorWithRed:1.0f green:0.4f blue:1.0f alpha:1.0f];
UIColor *color2 = [UIColor colorWithRed:1.0f green:0.2f blue:1.0f alpha:1.0f];

 if ([color1 isEqual:color2]) {
     NSLog(@"equals");
 }else {
     NSLog(@"not equal");
 }

 // This will print equals