UIColor的默认颜色空间是什么?

22

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

文章“获取iOS应用程序中正确的颜色”说我们应该使用通用RGB。另一方面,我发现有几篇帖子说我们应该在iOS上绝对使用sRGB。

似乎默认的颜色空间是sRGB,如在CGColorSpace参考中所写的.

在iPad Pro和iPhone 7中使用了新的颜色空间,称为“Display P3”。现有图像资源中的配置文件必须转换为Display P3。对于Digital Color Meter app,必须选择P3配置文件以获得“Display P3” RGB值。请参见屏幕截图。

How to pick the right RGB values for the Display P3 color space. enter image description here


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

14

简述

iOS默认使用扩展sRGB。

详细解释

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

  • 在代码中的任何位置设置断点,
  • 当lldb出现时,键入po UIColor.red
  • 以上命令将返回UIExtendedSRGBColorSpace 1 0 0 1,截至iOS 11,Xcode 9.2。

该颜色空间可以使用相同的sRGB值而不会改变颜色,但同时允许RGB值为负数以及大于1.0以表示超出sRGB颜色空间的颜色(即扩展sRGB颜色空间)。

有一个来自2016年的WWDC视频,Working with Wide Color,很好地解释了这种现象(跳转到8:35)。

因此,如果您在应用程序中使用sRGB颜色,则即使对于e-sRGB显示器,您也应该能够正常运行。当然,如果您需要超出sRGB色域的特定颜色之一,则需要使用e-sRGB颜色空间。


1
对我来说,e-sRGB允许使用超出0.0-1.0范围的值,但与sRGB兼容是关键点。很遗憾苹果已经删除了WWDC视频。 - Doug

12

我写了一篇博客文章详细解释了这个问题:

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颜色空间。

像往常一样,请查看苹果公司的UIColor文档以获取更多信息:

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

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


很高兴能够帮助! - vsanthanam510

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接