iPhone 6 比较两种 UIColors

Posted

技术标签:

【中文标题】iPhone 6 比较两种 UIColors【英文标题】:iPhone 6 compare two UIColors 【发布时间】:2015-04-27 11:43:36 【问题描述】:

我有两种颜色,这里是实例的日志:

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

【问题讨论】:

rawData是如何定义的? 您尝试使用- (BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha 吗? 是的,问题出在原始数据上,如果我们使用 cgfloat,我们有最大的值然后浮动。但我没有比较红色或绿色或蓝色值,因为您可以看到颜色日志与 acolor 和 hexColor 相同,但它不会比较它们。也许也记录四舍五入的值。当然问题出在类型上,所以我只需要一个,例如 float 或 cgfloat,因为我们永远不会成功,例如使用 0.92941176470588238 并且它不能 = 0.929411768。但是我正在比较 UIColors 并且日志告诉我它们对于 RGBA 具有相同的值。 【参考方案1】:

您是否尝试将两者四舍五入到相同的小数位数,然后进行比较? 例如,如果您同时四舍五入 9 位小数会发生什么?

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

这段代码改编自 alastair 在这个问题中的帖子:Round a float value to two post decimal positions

【讨论】:

问题是我使用 float 和 cgfloat 并且它适用于不同的架构。但是颜色向我显示了数字信息,一切似乎都是平等的。所以我在比较 UIColors 而不仅仅是原始数据浮点值。

以上是关于iPhone 6 比较两种 UIColors的主要内容,如果未能解决你的问题,请参考以下文章

iOS 纯代码适配iPhone6,6+

已经为 iPhone 4 和 5 构建的应用程序将如何在 iPhone 6 和 6 plus 中展示

为iPhone 5和6设置不同的字体大小

iPhone 6 摄像头的新技术 Focus Pixels 是啥意思?

苹果扩大iPhone 6/6S/7换电池范围:无视检测结果!

如何检测用户的 iPhone 6 Plus 是不是处于标准模式或缩放模式?