Swift的UIColorWell能否提供selectedColor对应的十六进制表示?
解决方案
以下分两种常见的colorWell使用场景给出对应实现:
1. macOS AppKit NSColorWell 场景
你获取到的selectedColor为NSColor类型,系统没有对外暴露公共的十六进制值属性,控件界面展示的十六进制内容是内部通过颜色分量转换生成的。如果想要稳定获取符合预期的十六进制值,推荐自行做颜色空间转换后生成,不要调用未公开私有属性避免上线被拒或版本升级后失效。
可直接使用的扩展代码如下:
extension NSColor { /// 转换为sRGB色域的十六进制RGB字符串,格式为#RRGGBB var rgbHexString: String { // 先切换到sRGB色域避免广色域颜色取值偏差 guard let sRGBColor = usingColorSpace(.sRGB) else { return "#000000" } let red = Int(sRGBColor.redComponent * 255) let green = Int(sRGBColor.greenComponent * 255) let blue = Int(sRGBColor.blueComponent * 255) return String(format: "#%02X%02X%02X", red, green, blue) } } // 调用示例 let targetHex = yourColorWell.selectedColor.rgbHexString
如果仅做调试用需要获取系统内部生成的十六进制值,可以用KVC访问私有属性(不推荐生产环境使用):let systemHex = yourColorWell.value(forKey: "_hexString") as? String
2. Web端color input 场景
如果是Web端使用的colorWell(即type="color"的input元素),直接读取控件的value属性即可得到标准十六进制RGB值:
const colorWell = document.querySelector('input[type="color"]') const targetHex = colorWell.value
注意:不要直接对未转换色域的NSColor读取RGB分量,广色域颜色默认处于displayP3空间,直接取分量生成的十六进制值会和控件界面展示的结果不一致。
内容的提问来源于stack exchange,提问作者Dan Donaldson
相关产品推荐
相关产品推荐

