在创建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)
}

最佳答案

不,这些电话是不对等的。将相同的RGBA值传递给每个RGBA值将导致不同的颜色。
Here's a handy article讨论颜色空间的差异。它很好地比喻了颜色空间就像尺子上的长度单位。如果我说某个对象的长度是1.0,那就没有任何意义,除非你知道“1.0”有多长。英寸?米?毛呢?帕塞克斯?单位的定义对度量中的数量意味着什么有很大的不同。
类似地,如果我说一种颜色的红色分量是1.0,那并不意味着什么,除非我也说1.0有多红。(绿色和蓝色组件也一样)对于web和应用程序设计的大部分历史,可以肯定的是,所有的测量都是相对于sRGB标准的-1.0红色表示“sRGB可以得到的红色”。
但随着电话、电脑、电视等的出现,支持更大色域的假设已不再安全。Display P3是较新的苹果设备使用的颜色空间(与较新的4K高清电视使用的颜色空间非常匹配)。P3支持比sRGB更广泛的颜色范围,这意味着“sRGB可以得到的红色”不够红色。
为了使sRGB和P3设备之间的互操作更加容易,苹果的api包含了一个“扩展的sRGB”颜色空间。在常规的sRGB中,与大多数颜色空间一样,组件值被限制在0.0到1.0的范围内,也就是说,不能有1.1的红色组件,如果您尝试,您只会将其限制在1.0。对于0.0–1.0范围内的组件值,扩展sRGB被定义为与sRGB相同,但允许使用该范围外的值来表示sRGB范围外的颜色。(这就是苹果文档所说的UIColor(red:green:blue:alpha:)使用扩展的sRGB颜色空间的意思。)
iOS中的UIColor(以及位于其下方的CGColor)不提供方便的颜色空间转换实用程序,但macOS中的NSColor则提供,这使得它可以方便地说明差异:
ios - 初始化UIColor displayP3颜色的最佳做法-LMLPHP
第一个红色相当于iOS中的UIColor(displayP3Red: 1, green: 0, blue: 0, alpha: 1)。第二个相当于iOS中的UIColor(red: 1, green: 0, blue: 0, alpha: 1)。如果你在P3显示器上看到这个答案,你可能会注意到色板上至少有细微的差别。
下面,请注意转换后的值。”sRGB max red“,akaUIColor(red: 1, green: 0, blue: 0, alpha: 1)大致相当于P3中的(r: 0.918, g: 0.2, b: 0.139, a: 1)P3 max red“,akaUIColor(displayP3Red: 1, green: 0, blue: 0, alpha: 1)在sRGB之外,但可以用“扩展sRGB”表示为(r: 1.093, g: -0.227, b: -0.15, a: 1)
*带P3显示屏的苹果设备包括iPhone 7、iPad Pro 2016、iMac fall 2015、MacBook Pro fall 2016及更高版本

10-05 20:26