2013-10-02 4 views
0

Я пытаюсь получить цвет, используемый UITextView.Сравнение UIColor не дает желаемого результата

Для этого я написал,

myTextView.textColor 

, но это дает мне выход как

UIDeviceRGBColorSpace 0.439216 0.439216 0.439216 1 

Любая идея, как получить фактическое сочетание RGB?


Я вижу ...

мне нужно умножить это на 255: D: P

Когда 0,439216 * 255 112 почему мой цвет сравнения не дает желаемого результата?

Цвет, который я применил к UITextView, приведен ниже, используя константу.

#define placeColor [UIColor colorWithRed:112/255.0 green:112/255.0 blue:112/255.0 alpha:1.0] 

Когда я сравниваю, как

if (aboutCompany.textColor == placeColor) { 
    NSLog(@"place color.."); 
    aboutCompany.text = @""; 
    aboutCompany.textColor = fottColor; 
} else { 
    NSLog(@"not place color.."); 
} 

Я получаю, не размещаем цвет ...

Любая причина, почему?

ответ

0

Если вы сравниваете два подкласса NSObject (или NSObject, в этом случае), вы не хотите использовать оператор ==. Оператор == не скажет вам, имеют ли два объекта одинаковое значение, он скажет вам, сравниваете ли вы тот же объект. Вам нужно использовать методы 'compare' или 'isEqual'. (Compare имеет некоторые дополнительные накладные расходы, потому что он фактически возвращает перечисление, указывающее одно из трех состояний, соответствующее <, =, и> соответственно.)

«Под капотом», что происходит в объективе C, вы никогда не прямо объявлять NSObject, вы только когда-либо объявляете указатель, который затем заполняется адресным пространством, заполняемым объектом.

{ 
    NSObject *foo=[[Foo alloc] init]; 
    NSObject *bar=foo; 

    foo==bar;//true 
    //If you inspect foo and bar really closely in the debugger, you'll discover they're both just integers pointing to a 'random' memory space. 
} 

{ 
    NSNumber *[email protected](1); 
    NSNumber *[email protected](1); 
    //Again, if you inspect these very closely, you'll discover they're pointers to memory space, but this time you're pointing to two different spaces in memory, even though you're storing the same data in them. 
    alpha==beta;//False, they're two separate objects 
    [alpha isEqualTo:beta];//true; their value is identical 
    [alpha intValue]==[beta intValue;//Again, true because their value is identical 
} 

Кроме того, я был бы очень осторожен с доверяя результаты операторов равенства при работе с плавающей точкой - и UIColor построены на поплавках. Поплавки имеют неприятную привычку не быть равными, даже когда они «должны» быть. Это связано с основным машинным представлением числа, которое может иметь определенную степень «шума» в числе. Этот шум в большинстве случаев относительно незначителен (например, +/- 1 * 10^-10), но это становится настоящей болью, когда вы хотите выполнять операции по равенству. Есть много статей в Интернете, которые охватывают это лучше, не стесняйтесь искать их, но вместо того, чтобы делать равенство, вам нужно проверить, что разница между этими двумя числами меньше, чем заданный epsilon, - что разница меньше 10^-5, например. Точно, как вывести соответствующий эпсилон, я не могу вам помочь, вам нужно будет провести собственное исследование. Я просто избегаю головной боли, никогда не использую поплавки, если могу помочь, и, конечно же, никогда не делаю ничего, что требует от них оператора равенства.

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