iPhone 6 сравнивают два UIColors

Я имею два цвета, вот журнал экземпляров:

(lldb) po acolor UIDeviceRGBColorSpace 0.929412 0.133333 0.141176 1 (lldb) po hexColor UIDeviceRGBColorSpace 0.929412 0.133333 0.141176 1 

У меня есть этот код, который работает для iPhone 4s 5, но не для iPhone 6:

 if ([acolor isEqual:hexColor]) { // other code here. } 

В качестве дополнительного я создаю этот acolor из пикселя изображения:

 CGFloat red = (rawData[byteIndex] * 1.0) / 255.0; CGFloat green = (rawData[byteIndex + 1] * 1.0) / 255.0; CGFloat blue = (rawData[byteIndex + 2] * 1.0) / 255.0; CGFloat alpha = (rawData[byteIndex + 3] * 1.0) / 255.0; 

Но, похоже, есть некоторые различия в значениях между iPhone 4 и iPhone 6:

например, если я печатаю красный цвет на iPhone 6, он имеет:

 (lldb) po red 0.92941176470588238 

и для iPhone 4:

 (lldb) po red 0.929411768 

По-моему, значения отличаются от архитектуры 32 и 64 бит.

Но, как мы видим в цветах, они, похоже, имеют правильные значения и, кажется, округлены. но он никогда не сравнится с успехом. Таким образом, acolor не равен hexColor. Никогда. только для iPhone 4 и 5.

Конечно, я могу использовать тип float вместо CGFloat . Но просто заметил, что округление кажется работой, и UIColors имеет одинаковые значения для разных устройств. Но сравнение не работает.

Я получаю hexColor, используя следующие методы:

 + (UIColor *)colorWithHexString:(NSString *)hexString { const char *cStr = [hexString cStringUsingEncoding:NSASCIIStringEncoding]; long x = strtol(cStr, NULL, 16); return [UIColor colorWithHex:(UInt32)x]; } + (UIColor *)colorWithHex:(UInt32)col { unsigned char r, g, b; b = col & 0xFF; g = (col >> 8) & 0xFF; r = (col >> 16) & 0xFF; return [UIColor colorWithRed:(float)r/255.0f green:(float)g/255.0f blue:(float)b/255.0f alpha:1]; } с + (UIColor *)colorWithHexString:(NSString *)hexString { const char *cStr = [hexString cStringUsingEncoding:NSASCIIStringEncoding]; long x = strtol(cStr, NULL, 16); return [UIColor colorWithHex:(UInt32)x]; } + (UIColor *)colorWithHex:(UInt32)col { unsigned char r, g, b; b = col & 0xFF; g = (col >> 8) & 0xFF; r = (col >> 16) & 0xFF; return [UIColor colorWithRed:(float)r/255.0f green:(float)g/255.0f blue:(float)b/255.0f alpha:1]; } - + (UIColor *)colorWithHexString:(NSString *)hexString { const char *cStr = [hexString cStringUsingEncoding:NSASCIIStringEncoding]; long x = strtol(cStr, NULL, 16); return [UIColor colorWithHex:(UInt32)x]; } + (UIColor *)colorWithHex:(UInt32)col { unsigned char r, g, b; b = col & 0xFF; g = (col >> 8) & 0xFF; r = (col >> 16) & 0xFF; return [UIColor colorWithRed:(float)r/255.0f green:(float)g/255.0f blue:(float)b/255.0f alpha:1]; } 

Вы пытались округлить оба до одного десятичного числа, а затем сравнить их? Например, что произойдет, если вы обойдете оба десятичных знака?

 float rounded = roundf (original * 1000000000) / 1000000000.0; 

Этот фрагмент кода адаптирован из сообщения alastair в этом вопросе: округлить значение float до двух постсимвольных позиций