How to compare two UIColor which have almost same shade or range in iOS?

后端 未结 5 644
独厮守ぢ
独厮守ぢ 2020-12-13 16:18

I have a condition in my app where user can choose 3 colors, but those colors should not match with each other, the problem is user can choose the similar color from the pal

相关标签:
5条回答
  • 2020-12-13 16:41

    trojanfoe's answer is great, here is a Swift version:

    My suggestion: Create an extension on UIColor like so:

    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
        }
    
    }
    

    Usage:

    // 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)
    }
    
    0 讨论(0)
  • 2020-12-13 16:41

    You can use this function also.

    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
    }
    
    0 讨论(0)
  • 2020-12-13 16:43

    isEqualTo: works when you initialize UIColor instance by passing float values

    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
    
    0 讨论(0)
  • 2020-12-13 16:58

    You need a tolerance, the value of which, only you can decide:

    - (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");
    }
    
    0 讨论(0)
  • 2020-12-13 16:58

    If I understood clearly :

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

    Then, you can compare the difference between the two colors using components[0] (red),components[1] (green), components[2] (blue) and components[3] alpha. Decide what you wanna compare. Example : fabs(components1[1]-components2[1]), or a mean between all theses differences, etc.

    0 讨论(0)
提交回复
热议问题