Swift

时间:2017-05-05 14:33:39

标签: ios swift uicolor color-space

我试图将包含Generic RGB颜色空间中颜色的字符串转换为Swift中的UIColor。例如,典型的字符串将如下所示:

0.121569 0.129412 0.156863 1

使用macOS中的颜色选择器,我发现这些值使用的是通用RGB颜色空间。

enter image description here

但是,当我尝试将这些值转换为UIColor时,它会使用sRGB颜色空间。

let red = CGFloat((components[0] as NSString).doubleValue)
let green = CGFloat((components[1] as NSString).doubleValue)
let blue = CGFloat((components[2] as NSString).doubleValue)
let alpha = CGFloat((components[3] as NSString).doubleValue)

print(UIColor(red: red, green: green, blue: blue, alpha: alpha))
// Log Result: NSCustomColorSpace sRGB IEC61966-2.1 colorspace 0.121569 0.129412 0.156863 1 

因此,我的应用程序中会显示不同的颜色。我通过将拾色器中的色彩空间更改为IEC61966-2.1来确认这一点,它确实显示了不同的值:

enter image description here

知道如何将Generic RGB值转换为正确的UIColor值吗?

编辑为了澄清,我无法将字符串中的颜色值更改为另一个方案,因为我正在读取XML文件中外部源的颜色

1 个答案:

答案 0 :(得分:4)

通过颜色空间的颜色转换在CGColor级别执行。例如:

let sp = CGColorSpace(name:CGColorSpace.genericRGBLinear)!
let comps : [CGFloat] = [0.121569, 0.129412, 0.156863, 1]
let c = CGColor(colorSpace: sp, components: comps)!
let sp2 = CGColorSpace(name:CGColorSpace.sRGB)!
let c2 = c.converted(to: sp2, intent: .relativeColorimetric, options: nil)!
let color = UIColor(cgColor: c2)

编辑我认为您原来问题的前提是错误的。事实证明,您正在尝试使用Xcode FontAndColorThemes文件中的数字。这些数字是sRGB,而不是通用RGB。

为了证明这一点,我运行了这段代码:

    let sp = CGColorSpace(name:CGColorSpace.sRGB)!
    let comps : [CGFloat] = [0.0, 0.456, 0.0, 1]
    let c = CGColor(colorSpace: sp, components: comps)!
    let v1 = UIView(frame:CGRect(x: 50, y: 50, width: 50, height: 50))
    v1.backgroundColor = UIColor(cgColor:c)
    self.view.addSubview(v1)

该颜色取自默认颜色主题的注释颜色。好吧,结果与评论颜色相同,因为此屏幕截图显示:

enter image description here

当我使用“吸管”工具时,我得到了相同的答案,就像我只是打开颜色样本来阅读检查员一样。当我在Xcode的样本和我的iOS样本上使用“eyedropper”工具时,我得到了相同的答案。在我看来,这证明这些颜色总是sRGB。