故事板中设置的UINavigationBar背景颜色与代码设置的颜色不同

我的应用程序将仅适用于iOS 8 ,我正在使用XCode 6.1.1

如果我通过故事板设置颜色(在“ Navigation Bar部分设置“ Bar Tint属性)

所需的颜色是:

56 186 145

我使用核心编码实用程序来获取我的颜色的浮动值。

按代码:

 let backgroundColor = UIColor(red: 0.22, green: 0.729, blue: 0.569, alpha: 1.0) self.navigationController!.navigationBar.barTintColor = backgroundColor self.navigationController!.navigationBar.translucent = false 

通过故事板设置的颜色与原始RGB相同。

  • 按代码: 在这里输入图像说明
  • 通过故事板: 在这里输入图像说明

编辑

我尝试使用let backgroundColor = UIColor(red: 0.255, green: 0.769, blue: 0.635, alpha: 1.0)和故事板上的RGB: 65 196 162基于@siejkowski评论,但我得到这些颜色:

  • 按代码: 在这里输入图像说明

  • 通过故事板: 在这里输入图像说明

为什么?

你观察到的色差有两个原因。

  1. Storyboard中设置的值是RGB(sRGB IEC61966-2.1)types,当您通过RGB值对UIColor进行编码时,它将返回RGB(通用RGB)值。

所以当你从Storyboard改变颜色时,RBGtypes的值是不同的。 要在故事板中获取RGB滑块的精确RGB值更改types。

点击设置图标,这是完全正确的RGB滑块选项。 它会显示一个popup式菜单 – select通用RGB选项。

在这里输入图像说明

现在,您可以在图像中观察RGB的值

 56 186 145 

现在正在改变

 49 175 126 

所以这些是代码的愿望值。

  1. 总结问题:

在代码中,你正在传递给参数的值,如下面的行

 UIColor(red: 0.22, green: 0.729, blue: 0.569, alpha: 1.0) 

所以它会使颜色代码的每个像素变化很小。 我build议你把这个值除以255并为编译器计算。 这会给你想要的颜色准确性。

所以现在对于新的值更新代码将是:

 let backgroundColor = UIColor(red: 49.0/255.0, green: 175.0/255.0, blue: 126.0/255.0, alpha: 1.0) self.navigationController!.navigationBar.barTintColor = backgroundColor self.navigationController!.navigationBar.translucent = false 

您可以看到不同的颜色,因为它们使用相同的RGB值设置,但使用不同的颜色空间。

UIColor,从代码设置,解释从sRGB空间的值,如下所示: https : //developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGColorSpace/index.html

但是,故事板颜色select器似乎默认使用原生RGB值。 你需要在两者之间进行转换。 您可以通过单击“ 颜色”选项卡中“ RGB滑块”列表选取器旁边的设置图标,在“故事板”颜色拾取器中执行此操作。 原生RGB值设置在彩色LCD设置下,sRGB值当然在sRGB以下

在这里输入图像说明

当你这样做的时候,似乎原生RGB空间中的56 186 145是sRGB空间中的73 186 141 。 所以你的代码需要是:

 let backgroundColor = UIColor(red: 0.286, green:0.729, blue:0.553, alpha:1.0) 

当我尝试从故事板/界面构build器(在XCode 6.3.2上)将颜色空间更改为GenericRGB时 ,XCode不保存更改。 所以如果我重新打开Interface Builder的颜色,颜色空间总是sRGBIEC61966-2.1。

所以我想出了一个不同的解决scheme,可能对别人有用:在Mac OS默认应用程序“ ColorSync Utility”中,我使用了Calculator,并将我的颜色值从GenericRGB转换为sRGBIEC61966-2.1 。 然后,我将转换后的值设置为“接口”构build器,并获得与以编程方式获得的结果相同的结果!

颜色同步截图