2

ここに 2 つの色があります。これはインスタンスのログです。

(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 のみ。

もちろん、floattype の代わりに使用できますCGFloatUIColorsしかし、丸めが機能しているように見え、異なるデバイスで同じ値を持っていることに気付きました。しかし、比較は機能しません。

このメソッドを使用して 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];
}
4

1 に答える 1

0

両方を同じ小数に丸めてから比較しようとしましたか? たとえば、小数点以下 9 桁を四捨五入するとどうなるでしょうか。

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

このコードは、この質問の alastair の投稿から改作されています: Round a float value to two post decimal positions

于 2015-02-25T13:14:28.830 に答える