如何比较iOS中几乎相同阴影或范围的两个UIColor?
我的应用程序中有一个条件,用户可以选择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值,但我想检查它的范围,让我知道是否有人知道如何比较相似的颜色。
你需要一个宽容 ,其价值,只有你可以决定:
- (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"); }
您也可以使用此function。
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的答案很棒,这是一个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) }
如果我明白了:
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])
,或所有这些差异之间的平均值等。
isEqualTo:
通过传递float
值初始化UIColor
实例时有效
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