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

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

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];
}

1 ответ

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

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

Этот фрагмент кода адаптирован из поста Аластера в этом вопросе: округлите значение с плавающей запятой до двух знаков после запятой

Другие вопросы по тегам