【问题标题】:Why is color defined in IB different than one defined in code?为什么 IB 中定义的颜色与代码中定义的颜色不同?
【发布时间】:2015-04-28 15:02:10
【问题描述】:

我有一个单视图应用程序。我在该单个视图中定义了两个 UIView 实例。我希望两者都具有相同的颜色。

对于第一个视图,我在 Interface Builder 中定义它并选择一种颜色。我想要#999999(灰色)。新的颜色选择器可以输入十六进制颜色值,因此很容易输入:999999

对于第二个视图,我通过设置第二个视图的背景颜色来定义它。我使用[UIColor colorWithRed:0.6 green:0.6 blue:0.6 alpha:1] 设置了相同的#999999 颜色。

简单计算:#99 -> 153 -> 153/255 == 0.6. 到目前为止很好。

但是生成的颜色不同。为什么?这感觉就像 xcode 中的一个错误。调试结果颜色后:

在 IB 中定义的颜色:UIDeviceRGBColorSpace 0.529648 0.529632 0.529641 1

代码中定义的颜色:UIDeviceRGBColorSpace 0.6 0.6 0.6 1


更新: 我知道这个问题的“重复”。他们有一个共同点。他们正确地发现了问题,但不幸地未能解决它。它测试了来自 Panic 和 Skala 的开发人员颜色选择器。他们有同样的问题。并且作为对伤害的侮辱,他们提供复制颜色作为十六进制值。客人什么,那里的数字根本不受颜色配置文件的影响。因此,例如颜色#999,它们为每个颜色组件提供准确的0.6。不幸的是,如果直接使用颜色,它会附加颜色配置文件,结果颜色会有所不同。获得准确 RBG 颜色的唯一方法是使用“安全网页颜色”,其中生成的颜色具有通用 RGB 颜色配置文件,换句话说,不受影响。问题是安全的网页颜色并不包含我们设计师使用的所有颜色。

【问题讨论】:

  • 你的计算有误! #99 -> 160!
  • @AndreSlotta No. #99 是 153 (9 * 16 + 9 = 153)。
  • @rmaddy 抱歉。我的错!我不小心加了 16 个!
  • 格式化代码,固定语法。

标签: ios objective-c xcode uicolor


【解决方案1】:

这是 UIColor 上的一个类别,如果有帮助,它可以从十六进制字符串创建 UIColor

+ (UIColor *)rz_colorFromHex:(uint32_t)hexLiteral
{
    uint8_t r = (uint8_t)(hexLiteral >> 16);
    uint8_t g = (uint8_t)(hexLiteral >> 8);
    uint8_t b = (uint8_t)hexLiteral;

    return [self rz_colorFrom8BitRed:r green:g blue:b];
}

+ (UIColor *)rz_colorFromHexString:(NSString *)string
{
    NSParameterAssert(string);
    if ( string == nil ) {
        return nil;
    }

    unsigned int hexInteger = 0;
    NSScanner *scanner = [NSScanner scannerWithString:string];

    [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"x#"]];
    [scanner scanHexInt:&hexInteger];

    return [self rz_colorFromHex:hexInteger];
}

至于为什么你的颜色不同。我会设置一个断点,并看到它运行时颜色实际上是相同的。您甚至可以打印出每种颜色的 rgb 通道,以确保它们没有区别。

如果这是 Xcode 错误,我会感到惊讶,但请告诉我当您从调试器检查颜色时会发生什么。

编辑:

因此,进一步研究这一点,您可以将不同的色彩空间用于 RGB。默认情况下,界面构建器使用的是 iOS 使用的不同的界面构建器。要切换它们,请在使用颜色选择器时单击小齿轮并将其设置为 Generic RGB。

【讨论】:

  • 在 IB 中定义:UIDeviceRGBColorSpace 0.529648 0.529632 0.529641 1 在代码中定义:UIDeviceRGBColorSpace 0.6 0.6 0.6 1
  • 更新了我的答案,希望对您有所帮助。
  • 回答有道理。当我选择通用 RGB 时,它确实是我看到的调试器报告的值。我仍在与如何使用颜色选择器输入 #999 作斗争。每次我切换到通用 RGB 并输入 99999 时,它都会切换到 sRGB。
  • Hacky,但如果您将其设置为 A9A9A9,然后从 sRGB 切换到通用,它应该为您将其切换为 999999。不知道为什么会这样。
【解决方案2】:

你可以这样做

另一个视图的代码:

self.testView.backgroundColor = [UIColor colorWithRed:153.0/255.0 green:153.0/255.0 blue:153.0/255.0 alpha:1.0];

更新:

在 Xcode 中,单击颜色选择器中的颜色空间弹出窗口并选择“Generic RGB”,然后输入 Photoshop 中的红色、绿色和蓝色值,而不是十六进制值

我们可以找到很多重复项:

Wrong color in Interface Builder's color picker

Weird colors in XCode Interface Builder?

Wrong color in Interface Builder

Xcode 6 beta color picker issue

...

【讨论】:

  • 好吧,问题是为什么如果您在 IB 中定义颜色,它与代码中定义的颜色不同。我知道如何定义颜色。但结果不一样。 IB 的颜色有点暗。
  • 如果你喜欢我展示的,结果是一样的。如果使用 RGB 滑块 - 结果不一样。
  • 没错,当使用网络安全颜色时,它可以工作。但是如何在那里输入我的自定义颜色?
  • 更新:选择通用 RGB 并更改值,不要触摸十六进制值
  • 是的,这种作品。但离方便还差得很远。
【解决方案3】:

Apple 在 El Capitan 解决了整个问题。因此,如果您在 El Capitan 上使用 xcode 7,这不再是问题。输入#hex 颜色值不再改变颜色空间。

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2012-04-07
    • 1970-01-01
    • 2018-07-20
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多