【问题标题】:What is the default color space for UIColor?UIColor 的默认色彩空间是什么?
【发布时间】:2015-05-14 11:49:06
【问题描述】:

我找不到描述在从 UIColor 类初始化实例时应该为 RGB 值使用哪个颜色空间的文章或文档。

文章Getting the right colors in your ios app 说我们应该使用Generic RGB。另一方面,我发现有几篇帖子说我们绝对应该在 iOS 上使用 sRGB。

默认颜色空间似乎是CGColorSpace Reference中所写的sRGB

a new color space在iPad Pro和iPhone 7中使用,称为“Display P3”。现有图像资源中的配置文件必须转换为Display P3。对于 Digital Color Meter 应用程序,必须选择 P3 配置文件才能获得“Display P3”RGB 值。请参阅屏幕截图。

【问题讨论】:

  • 所以我们不能只从 Sketch 颜色选择器中获取颜色,将其除以 255 并传递给 UIColor(red:, green:, blue:, alpha:),对吗?我看到的唯一解决方案是使用带有“sRGB 显示”的数字拾色器
  • 颜色不是仅使用 RGB 值定义的;您需要指定定义 RGB 值的颜色空间。

标签: ios rgb uicolor srgb


【解决方案1】:

TL;DR

iOS 使用扩展 sRGB 作为默认设置。

详细说明

这可以通过 Xcode 中的调试器轻松验证:

  • 在代码中的任意位置放置断点,
  • 当 lldb 出现时,输入po UIColor.red
  • 从 iOS 11、Xcode 9.2 开始,上述命令将返回 UIExtendedSRGBColorSpace 1 0 0 1

此颜色空间可以使用相同的 sRGB 值而无需更改颜色,但同时允许 RGB 值变为负值以及大于 1.0 以表示 sRGB 颜色空间(即扩展的 sRGB 颜色空间)之外的颜色。

2016 年的 WWDC 视频Working with Wide Color 很好地解释了这一现象(转至 8:35)。

因此,如果您在应用程序中使用 sRGB 颜色,即使是 e-sRGB 显示器,您也应该可以使用。当然,如果您需要 sRGB 色域之外的特定颜色之一,则需要使用 e-sRGB 颜色空间。

【讨论】:

  • e-sRGB 允许 0.0-1.0 范围之外的值,但与 sRGB 兼容的解释是我这里的关键点。 ? 很遗憾,Apple 删除了 WWDC 视频。
【解决方案2】:

我写了一篇博文详细解释了这一点:

http://www.vsanthanam.com/writing/2017/7/6/colors-in-ios-ensuring-consistency-between-designs-interface-builder-and-uicolor

基本上,虽然 Sketch 使用了一个自定义颜色选择器,它假设 sRGB 颜色分量,但 Xcode 的颜色选择却没有。

UIColor 最常见的工厂方法 +colorWithRed:green:blue:alpha: 假定为 sRGB 颜色空间(如果与 iOS 10.x 链接,则为扩展 sRGB),但它还有另一个工厂方法 colorWithDisplayP3Red:green:blue:alpha:这将采用您的 Display P3 颜色空间 RGBA 组件,但在内部将它们存储为翻译值并引用 sRGB 颜色空间。

与往常一样,请查看 Apple 关于 UIColor 的文档以获取更多信息:

https://developer.apple.com/documentation/uikit/uicolor?changes=latest_minor

有趣的是,AppKit 的 UIColor 对应物 NSColor 通过更多可用的工厂方法(包括一种专门为模仿 UIColor 的 +colorWithRed:green:blue:alpha: 行为而设计的自定义颜色空间)支持更大的灵活性。我不确定为什么 UIColor 更受限制。

【讨论】:

  • 很高兴能帮上忙!