63 votes

Comment définir des valeurs constantes de UIColor ?

Je veux faire quelque chose comme ça, mais je n'arrive pas à obtenir une syntaxe coopérative.

static const UIColor *colorNavbar = [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0];

Je suppose que je pourrais définir des macros, mais elles sont hideuses.

0 votes

Oui, Objective-C pour être plus spécifique au langage - mais c'est sur l'iPhone dans ce cas.

0 votes

static UIColor *const color = .... est possible en Objective-C++. Il suffit de changer l'extension pour *.mm .

126voto

jasoncrawford Points 1492

J'aime utiliser les catégories pour étendre les classes avec de nouvelles méthodes pour ce genre de choses. Voici un extrait de code que je viens d'écrire aujourd'hui :

@implementation UIColor (Extensions)

+ (UIColor *)colorWithHueDegrees:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness {
    return [UIColor colorWithHue:(hue/360) saturation:saturation brightness:brightness alpha:1.0];
}

+ (UIColor *)aquaColor {
    return [UIColor colorWithHueDegrees:210 saturation:1.0 brightness:1.0];
}

+ (UIColor *)paleYellowColor {
    return [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0];
}

@end

Maintenant, en code, je peux faire des choses comme :

self.view.backgroundColor = highlight? [UIColor paleYellowColor] : [UIColor whitecolor];

et mes propres couleurs définies s'intègrent parfaitement à celles définies par le système.

(Soit dit en passant, je commence à penser davantage en termes de HSB qu'en termes de RVB, car je prête davantage attention aux couleurs).

UPDATE concernant le précalcul de la valeur : Mon intuition me dit que ça n'en vaut pas la peine. Mais si vous voulez vraiment, vous pouvez mémoriser les valeurs avec des variables statiques :

+ (UIColor *)paleYellowColor {
    static UIColor *color = nil;
    if (!color) color = [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0];
    return color;
}

Vous pourriez aussi créer une macro pour faire la mémorisation.

0 votes

J'aime cette approche. Elle permet d'atteindre l'organisation que je recherche dans la définition et l'utilisation. Je n'étais pas familier avec (Extensions), je vais devoir me documenter sur ce sujet car il pourrait être approprié pour d'autres classes que j'utilise. Enfin, (je vais sans doute m'éloigner du sujet), existe-t-il des utilitaires de sélection de la BHD comme il en existe pour le RBG. J'aime bien IB, mais je trouve utile de voir les couleurs complémentaires ensemble car, assez souvent, je veux plus d'une couleur à la fois.

0 votes

Ah oui, mais un problème que j'essayais de résoudre, c'est d'obtenir la valeur précalculée. Je ne veux pas effectuer trois divisions à chaque fois que je fais référence à la couleur.

1 votes

Re choix des couleurs : Je ne suis pas un expert. J'utilise le sélecteur de couleurs d'Interface Builder. Il comporte une roue des couleurs, des curseurs pour les couleurs RVB ou HSB, ainsi qu'une boîte de crayons. Je l'aime bien.

35voto

drawnonward Points 35444

Je crée généralement une catégorie de UIColor pour chaque projet :

@interface UIColor (ProjectName)

+(UIColor *) colorForSomeTable;
+(UIColor *) colorForSomeControl;
+(UIColor *) colorForSomeText;

@end

Avec les constantes de l'implémentation :

@implementation UIColor (ProjectName)

+(UIColor *) colorForSomeTable { return [UIColor colorWithRed:...]; }

@end

Je fais également la même chose pour UIFont et UIImage selon les besoins.

4 votes

Absolument génial ! Ma question subsidiaire est de savoir où mettre ce code ? J'ai des fichiers Constants.h/Constants.m (dans mes en-têtes précompilés) et je veux simplement "déclarer" une constante couleur... Je n'aime pas mettre ce genre de code là-dedans... Où le mettriez-vous ?

0 votes

À mon avis, c'est la voie à suivre.

11voto

JeremyP Points 46808

Pour développer la réponse de jasoncrawford (je l'aurais mis en commentaire, mais vous ne pouvez pas formater le code dans les commentaires), si vous voulez précalculer les valeurs (ou le faire une seule fois).

+ (UIColor *)paleYellowColor
{
    static UIColor* paleYellow = nil;
    if (paleYellow == nil)
    {
        paleYellow = [UIColor colorWithHueDegrees:60 saturation:0.2 brightness:1.0];
    }
    return paleYellow;
}

La raison pour laquelle votre idée originale ne fonctionne pas est que le compilateur ne peut utiliser les initialisateurs qu'en dehors des fonctions, et non dans le code normal. Vous auriez pu obtenir quelque chose comme ce que vous vouliez avec la méthode initialize, par exemple.

static UIColor* colorNavBar = nil;

+(void) initialize
{
    if (colorNavBar != nil)
    {
        colorNavBar = ....
    }
}

NB le const Le qualificatif de votre définition originale est redondant puisque UIColor est immuable de toute façon.

0 votes

Merci pour tous ces bons conseils et techniques. Je vais probablement suivre ce modèle pour certaines de mes autres tâches de conception plus spécifiques aux applications. J'utilise les classes/catégories suggérées dans le premier message de Jason. Cela permet une manière élégante de définir une classe de thème de différentes couleurs.

0 votes

Oh oui, pour ce qui est du const sur immutable -- oui, je l'ai compris ! merci de l'avoir signalé.

10voto

kasperfn Points 36

Vous pouvez "définir" une CONSTANTE similaire comme suit :

#define FAV_COLOR [UIColor colorWithRed:24/255.0f green:89/255.0f blue:36/255.0f alpha:0.9]

et l'appeler par son nom comme vous avez l'habitude de le faire avec les constantes : FAV_COLOR

J'espère que cela vous aidera.

0 votes

Kasperfn c'est la même chose que la réponse de intorpedro (ci-dessus). Je préfère éviter les macros. Ma réponse préférée est celle de la catégorie car elle constitue une meilleure utilisation OO du langage.

0 votes

Utiliser des macros pour les constantes est une mauvaise chose.

0 votes

@IulianOnofrei Y a-t-il une raison particulière ? Pourquoi la macro est-elle mauvaise ? Y a-t-il un problème de performance ? Veuillez être bref.

8voto

intropedro Points 1206

Vous pouvez le faire :

#define backgroundColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]

2 votes

J'évite les solutions macro lorsqu'une alternative plus sûre du point de vue du type ou du compilateur est disponible. Vous avez peut-être remarqué que dans ma description initiale, je reconnais qu'il existe une solution "macro", mais qu'elle est "laide". Dans ce cas, la laideur vient du fait qu'il existe une solution propre utilisant la fonctionnalité de catégorie du langage.

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