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 pallet for all 3 fields.
I'm trying below code, here color2 has slightly different value of 'green' than 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");
}
output: 'not equal'
This is correct by logic because it compares RGB value but I want to check range of it, Let me know if anyone knows how to compare the similar colors.
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");
}
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
}
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)
}
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.
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