2017-05-05 3 views
4

Je tente de convertir une chaîne contenant une couleur dans l'espace colorimétrique RVB générique en UIColor dans Swift. Par exemple, une chaîne typique ressemblerait à ceci:Init Générique RVB dans Swift

0.121569 0.129412 0.156863 1 

Utilisation du sélecteur de couleur dans Mac OS, j'ai découvert que ces valeurs utilisent l'espace colorimétrique RVB générique.

enter image description here

Cependant, lorsque je tente de convertir ces valeurs en UIColor, il utilise l'espace colorimétrique 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 

Par conséquent, une couleur différente est affichée dans mon application. Je confirme en changeant l'espace de couleur dans Color Picker à IEC61966-2.1 et différentes valeurs affichées en effet:

enter image description here

Toute idée comment je convertir les valeurs RVB génériques dans les valeurs UIColor correctes?

EDIT Pour plus de précisions, je suis incapable de changer les valeurs de couleur dans la chaîne dans un autre système que je lis les couleurs à partir d'une source externe dans un fichier XML

+0

Vous voulez dire les bonnes valeurs UIColor? NSColor c'est OS X seulement –

Répondre

3

Conversion des couleurs par l'espace couleur est réalisée au niveau de CGColor. Exemple:

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) 

EDIT Je pense que la prémisse de votre problème d'origine est erronée. Vous essayez, il s'avère, d'utiliser les nombres dans un fichier Xcode FontAndColorThemes. Ces numéros sont sRGB, pas RVB générique.

Pour le prouver, j'ai couru ce code:

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) 

Cette couleur est tirée de la couleur Commentaire du thème de la couleur par défaut. Eh bien, le résultat est identique à la couleur de commentaires, car ce capture d'écran montre:

enter image description here

je reçois la même réponse quand j'utilise l'outil « Pipette », comme quand j'ouvre simplement la palette de couleurs pour lire la inspecteur. Et j'obtiens la même réponse quand j'utilise l'outil "Pipette" sur l'échantillon de Xcode et sur mon échantillon iOS. Cela me semble prouver que ces couleurs étaient toujours sRGB.

+1

En fait je pense qu'il n'y a pas besoin de la conversion; vous pouvez envelopper 'c' directement dans un UIColor. – matt

+1

J'ai étendu ma réponse pour montrer que la prémisse de la question était erronée. – matt