2014-02-07 5 views
9

У меня есть условие в моем приложении, где пользователь может выбрать 3 цвета, но эти цвета не должны совпадать друг с другом, проблема заключается в том, что пользователь может выбрать такой же цвет из поддона для всех трех полей.Как сравнить два UIColor, которые имеют почти одинаковый оттенок или диапазон в iOS?

Пытаюсь ниже код, здесь цвет2 имеет несколько иное значение «зеленых», чем цвет1: -

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, но Я хочу проверить его диапазон, Дайте мне знать, если кто-нибудь знает, как сравнивать похожие цвета.

+2

Try 'CGColorEqualToColor (<# CGColorRef цвет1 #>, <#CGColorRef цвет2 #>);' – Buntylm

+0

метод имеет описание: - «Два цвета равны, если они имеют одинаковые цветовые пространства и численно равные цветовые компоненты ». Он возвращает false, может быть, он не может проверить цветовое пространство, не уверен. – Shrejas

ответ

30

Вам нужен допуск, значение которого, только вы можете решить:

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

@DaveWood Извините, я не понимаю, что вы имеете в виду WRT '||'/'&&'. Операция 'return' будет короткозамкнута, как только цвет выпадет за пределы допуска. – trojanfoe

+1

Вы сожалеете. Я прыгнул с пистолета, поскольку версия, которую я печатала, тестировалась неравномерно (и не в такой хорошей функции, как вы). :) –

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]), или среднее между всеми различиями тезиса и т. Д.

+0

Да, логика для сравнения с fabs верна, спасибо. – Shrejas

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

trojanfoe «s ответ велик, вот 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) 
} 
+0

По умолчанию Ie-6:] – ZYiOS

 Смежные вопросы

  • Нет связанных вопросов^_^