技术问询:displayP3Red与red的区别及Swift中UIColor初始化方式差异
关于UIColor的两个常见问题解答
问题1:displayP3Red与red之间存在哪些区别?
这俩本质是不同颜色空间下的红色,核心区别主要有这几点:
- 色域范围不一样:
UIColor.red用的是咱们日常最常用的sRGB颜色空间,这是数字内容的通用标准,大部分显示器、网页都依赖它;而UIColor.displayP3Red采用苹果推出的Display P3色域,这个色域更宽,能呈现sRGB覆盖不到的更鲜艳色彩,比如饱和度更高的正红色。 - 显示效果有差异:在支持Display P3的设备上(比如iPhone 7及以后机型、Mac的Retina显示器),
displayP3Red看起来会比普通red更亮更饱和;但如果是老设备或不支持的显示器,系统会自动把它转换成sRGB对应的红色,这时两者视觉差异就很小了。 - 适用场景不同:要是你做的是摄影、设计类App,追求极致色彩还原,那Display P3系列颜色更合适;但如果是普通工具类App,用
sRGB的red就够了,兼容性拉满,所有设备都能稳定显示。
问题2:Swift开发中两种UIColor初始化方式的差异
我猜你遇到的大概率是下面两种典型的初始化方式,我分别给你唠清楚:
情况1:系统预定义颜色 vs 自定义RGB初始化
比如 UIColor.red 和 UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
- 便捷性天差地别:系统预定义的颜色(像
UIColor.red、UIColor.systemBlue)是苹果帮咱们封装好的,直接调用就行,不用自己算RGB值,省事儿;自定义RGB初始化就得自己传入0到1之间的RGB值和透明度,虽然麻烦,但能创建任何你想要的颜色,灵活性拉满。 - 动态适配能力不同:iOS 13之后,系统预定义的颜色(尤其是带
system前缀的,比如UIColor.systemRed)支持自动适配深色模式,到了深色模式会自动调暗或调整饱和度;但自定义的RGB初始化颜色默认不会,要是想适配深色模式,得手动用UIColor(dynamicProvider:)来实现。 - 颜色空间一致性:普通的
UIColor.red和UIColor(red:1.0, green:0.0, blue:0.0, alpha:1.0)都是sRGB空间的,所以同设备上显示效果完全一样;但如果是UIColor.displayP3Red这种预定义的Display P3颜色,就和普通RGB初始化的颜色有明显差异了(参考问题1的区别)。
情况2:sRGB空间初始化 vs Display P3空间初始化
比如 UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0) 和 UIColor(displayP3Red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
- 核心是颜色空间不同:前者是sRGB,后者是Display P3,具体差异看问题1里的说明就行。
- 参数含义不一样:虽然都是传red、green、blue的数值,但因为色域范围不同,同样的1.0红色值,Display P3的红色会比sRGB的更饱和。
- 设备兼容性有区别:支持Display P3的设备能显示出后者的鲜艳色彩,不支持的设备会自动转换,这时两者看起来差别不大,但仔细看还是能感觉到饱和度的细微差异。
内容的提问来源于stack exchange,提问作者Louis Eppler
相关产品推荐
相关产品推荐

