初始化 UIColor displayP3 颜色时的最佳实践

Best practices when initializing a UIColor displayP3 color

是否最好在创建 UIColor 时默认使用 init(displayP3Red:green:blue:alpha:) 进行可用性检查?老实说,我看不出两者之间的区别,所以我不确定它有多重要,但我希望有人能对此有所启发。

if #available(iOS 10.0, *) {
    self.init(displayP3Red: r, green: g, blue: b, alpha: a)
} else {
    self.init(red: r, green: g, blue: b, alpha: a)
}

区别在于return值:

self.init(displayP3Red: r, green: g, blue: b, alpha: a)

Return 一个 sRGB 值:

The color object. The color information represented by this object is in an extended range sRGB colorspace. On applications linked for iOS 10 or later, the color is specified in an extended range sRGB color space.


self.init(red: r, green: g, blue: b, alpha: a)

Return一个RGB值:

The color object. The color information represented by this object is in an RGB colorspace. On applications linked for iOS 10 or later, the color is specified in an extended range sRGB color space. On earlier versions of iOS, the color is specified in a device RGB colorspace.

发件人:https://developer.apple.com/documentation/uikit/uicolor

sRGB 格式是为了在每个设备上具有相同的颜色。

你可以看到更详细的例子:http://inaka.net/blog/2014/09/05/getting-the-right-colors-in-your-ios-app/

不,这些调用并不等同。将相同的 RGBA 值传递给每个值将产生不同的颜色。

Here's a handy article 讨论颜色差异 space。它很好地类比了颜色 space 就像尺子上的长度单位。如果我说某个对象的长度为 1.0,那没有任何意义,除非你知道“1.0”有多长。英寸?米?弗隆?秒差距?单位的定义对测量中的数量意味着什么有很大的不同。

类似地,如果我说一种颜色的红色分量为 1.0,那没有任何意义,除非我也说 红色 1.0 是多少。 (绿色和蓝色组件同上。)在 Web 和应用程序设计的大部分历史中,可以安全地假设所有测量值都与 sRGB 标准相关——1.0 红色表示 "as red as sRGB can get"。

但随着支持更大色域的电话、计算机、电视等的出现,这种假设不再安全。显示 P3 是较新的 Apple 设备使用的颜色 space(与较新的 4K HDR 电视使用的颜色非常匹配)。 P3支持比sRGB更广泛的颜色范围,也就是说"as red as sRGB can get"不够红

为了使 sRGB 和 P3 设备之间的互操作更容易一些,Apple 的 API 包括 "Extended sRGB" 颜色 space。在常规 sRGB 中,与在大多数颜色 spaces 中一样,分量值被限制在 0.0–1.0 范围内——也就是说,你不能有 1.1 的红色分量,如果你尝试,你只会得到它限制在 1.0。扩展 sRGB 被定义为与 sRGB 相同,用于 0.0–1.0 范围内的分量值,但允许使用该范围之外的值来表示 sRGB 色域之外的颜色。 (这就是 Apple 文档中所说 UIColor(red:green:blue:alpha:) 使用扩展的 sRGB 颜色 space 时的意思。)


UIColor(以及位于其下方的 CGColor)在 iOS 中不提供方便的颜色 space 转换实用程序,但 NSColor 在macOS 可以,这便于说明差异:

第一个红色相当于iOS中的UIColor(displayP3Red: 1, green: 0, blue: 0, alpha: 1)。第二个相当于 iOS 中的 UIColor(red: 1, green: 0, blue: 0, alpha: 1)。如果您在 P3 显示器上查看此答案*,您可能至少会注意到颜色样本的细微差别。

在下面,请注意转换后的值。 "sRGB max red",又名 UIColor(red: 1, green: 0, blue: 0, alpha: 1) 大致相当于 P3 中的 (r: 0.918, g: 0.2, b: 0.139, a: 1)。 "P3 max red",又名 UIColor(displayP3Red: 1, green: 0, blue: 0, alpha: 1) 在 sRGB 之外,但可以在 "extended sRGB" 中表示为 (r: 1.093, g: -0.227, b: -0.15, a: 1)

* 配备 P3 显示屏的 Apple 设备包括 iPhone 7、iPad Pro 2016、iMac 2015 秋季、MacBook Pro 2016 秋季及更新机型