2017-05-05 98 views
4

我試圖在泛型RGB色彩空間中將包含顏色的字符串轉換爲Swift中的UIColor。例如,一個典型的字符串應該是這樣的:在Swift初始化泛型RGB

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

任何想法,我將如何通用RGB值轉換成正確的UIColor值?

編輯爲了澄清,我不能,因爲我從外部源通過色彩空間的方法是閱讀的顏色在一個XML文件

+0

你的意思是正確的UIColor值? NSColor它只是OS X –

回答

3

顏色轉換來改變字符串中的顏色值轉換成另一種方案在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色板上使用「吸管」工具時,我會得到同樣的答案。這似乎證明這些顏色總是sRGB。

+1

其實我認爲沒有必要進行轉換;你可以直接在UIColor中包裝'c'。 – matt

+1

我擴展了我的答案以表明這個問題的前提是錯誤的。 – matt