57 votes

Comment récupérer le rouge, le vert, le bleu (RGB) et l'alpha d'un objet UIColor ?

J'obtiens un UIColor renvoyé par cette méthode :

- (UIColor *)getUserSelectedColor {   
    return [UIColor colorWithRed:redSlider.value green:greenSlider.value blue:blueSlider.value alpha:1.0];
}

et obtenir une couleur comme celle-ci :

UIColor *selectedColor = [(ColorPickerView *)alertView getUserSelectedColor];

Je veux maintenant obtenir le rouge, le vert et le bleu de selectedColor, afin d'utiliser ces valeurs. Je veux des valeurs entre 0 et 1.

8 votes

Remarque : vous devriez vous pencher sur les conventions de dénomination. getColor est mauvais pour deux raisons, d'abord il utilise le préfixe get qui est une erreur courante pour les développeurs Java, ensuite il ne décrit pas le type de couleur. Un meilleur nom est probablement userSelectedColor . Regardez comment UIKit nomme les getters, et les propriétés, et faites de même.

0 votes

@PeyloW, Comment userSelectedColor décrire "quel genre de couleur c'est" mieux que getUserSelectedColor ? Sachant que sans le get préfixe, c'est exactement la même chose. Personnellement, je ne comprends pas pourquoi Apple recommande de ne pas utiliser le préfixe get préfixe. Je l'utilise dans certains cas pour faciliter l'autocomplétion, et pour éviter les conflits possibles avec des API privées. Par exemple, j'ai une catégorie sur UIColor et je peux facilement taper [UIColor get et voir une liste de toutes mes méthodes. Et si je veux une couleur rouge foncé, darkRedColor causerait des problèmes si Apple décidait de l'ajouter aussi, mais getDarkRedColor ne le ferait pas.

118voto

PeyloW Points 25312

La raison du crash lors de l'accès SelectedColor.CGColor il se peut que vous ne reteniez pas le résultat de getColor peut-être que ce dont vous avez besoin est :

SelectedColor = [[(ColorPickerView *)alertView getColor] retain];

Vous ne pouvez obtenir la composante de couleur RVB qu'à partir d'un fichier de type UIColor qui utilise l'espace couleur RGB, puisque vous utilisez colorWithRed:green:blue:alpha: ce n'est pas un problème, mais soyez-en conscient si votre code change.

Dans cette optique, il est très facile d'obtenir les composants de couleur :

const CGFloat* components = CGColorGetComponents(SelectedColor.CGColor);
NSLog(@"Red: %f", components[0]);
NSLog(@"Green: %f", components[1]); 
NSLog(@"Blue: %f", components[2]);
NSLog(@"Alpha: %f", CGColorGetAlpha(SelectedColor.CGColor));

0 votes

Comme masquer les coins arrondis et autres ? Bien sûr, ajoutez une nouvelle question.

0 votes

Salut PeyloW ! J'ai utilisé la même chose mais cela donne les composants de couleur verte quand je passe la couleur noire. Savez-vous pourquoi cela se produit ? Vous pouvez voir mon message ici aussi->. stackoverflow.com/questions/4155642/

0 votes

@Ganesh - Cela ne fonctionne que pour les couleurs RVB, +[UIColor blackColor] n'est pas une couleur RGB et n'a qu'une seule composante de couleur pour luminosité .

23voto

Willster Points 1458

Cette solution fonctionne également pour les couleurs non RVB, par exemple le noir ou le blanc.

UIColor *color = [UIColor blackColor];
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0;
// iOS 5
if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) {
     [color getRed:&red green:&green blue:&blue alpha:&alpha];
} else {
     // < iOS 5
     const CGFloat *components = CGColorGetComponents(color.CGColor);
     red = components[0];
     green = components[1];
     blue = components[2];
     alpha = components[3];
}

// This is a non-RGB color
if(CGColorGetNumberOfComponents(color.CGColor) == 2) {
    CGFloat hue;
    CGFloat saturation;
    CGFloat brightness;
    [color getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha];

}

0 votes

Le bloc de code "non-RGB" est également réservé à iOS5+. Vous pouvez le marquer comme tel.

8voto

Yar Points 25421

Dans la plupart des cas, cela fonctionnera, sauf si la conversion en RVB ne fonctionne pas.

float red, green, blue, alpha;
BOOL conversionToRGBWentOk = [color getRed:&red green:&green blue:&blue alpha:&alpha];

C'est à cela que servent ces méthodes, en fait. Si le conversionToRGBWentOk es NO vous aurez un problème, cependant.

1 votes

Merci, votre solution est la meilleure que j'aie jamais vue.

1 votes

Mais il provoque un crash sur mon simulateur ios4.3. Il est compatible IOS5 +.

4voto

unwind Points 181987

Je pense que vous devriez avoir un un regard ici où le guide d'Ars montre comment étendre le champ d'application de la UIColor avec un support pour accéder aux composants de couleur.

2voto

Waseem Shah Points 806

Tu fais tout simplement ça

CGFloat red,green,blue,alpha;

[UIColorobject getRed:&red green:&green blue:&blue alpha:&alpha];

en rouge, vert, bleu et alpha vous obtenez la valeur rgb si vous avez des questions, n'hésitez pas à les poser...

Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X