web-dev-qa-db-fra.com

Comment définir des valeurs constantes d'UIColor?

Je veux faire quelque chose comme ça, mais je ne peux 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 laides.

59
mobibob

J'aime utiliser les catégories pour étendre les classes avec de nouvelles méthodes pour ce genre de chose. 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’harmonisent parfaitement avec celles définies par le système.

(Incidemment, je commence à penser plus en termes de HSB que de RVB car je suis plus attentif aux couleurs.)

UPDATE concernant le précalcul de la valeur: Mon intuition est que cela n'en vaut pas la peine. Mais si vous le vouliez 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 pouvez également faire une macro faire la mémoizing.

124
jasoncrawford

Je crée habituellement une catégorie d’UIColor pour chaque projet:

@interface UIColor (ProjectName)

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

@end

Avec les constantes dans l'implémentation:

@implementation UIColor (ProjectName)

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

@end

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

35
drawnonward

Vous pouvez définir une constante similaire à celle-ci:

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

et appelez-le par son nom comme avec les constantes: FAV_COLOR

J'espère que cela pourra aider.

11
kasperfn

Pour développer la réponse de jasoncrawford (je l'insérerais sous forme de commentaire, mais vous ne pouvez pas formater le code dans les commentaires) si vous souhaitez 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 initiale ne fonctionne pas est que le compilateur ne peut utiliser que des initialiseurs en dehors des fonctions, pas du code normal. Vous auriez pu réaliser quelque chose comme ce que vous vouliez avec l’initialisation de methosd, par exemple.

static UIColor* colorNavBar = nil;

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

NB: le qualificatif const de votre définition d'origine est redondant car UIColor est immuable de toute façon.

11
JeremyP

Tu peux le faire:

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

Dans Swift: Définir l'extension

extension UIColor {

   class func XXXWhiteColor() -> UIColor {
        return UIColor(red: 256, green: 256, blue: 256, alpha: 1.0)
    }

    class func XXXGreenColor() -> UIColor {
        return UIColor(red: 73/255.0, green: 212/255.0, blue: 86/255.0, alpha: 1.0)
    }
}

Utilisez comme: Label.background = UIColor.XXXWhiteColor ()

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

myLabel.textColor=textColorApp;
4
Rinju Jain

Il suffit de définir la macro ci-dessous dans votre fichier constant et de ne transmettre que la valeur RVB et de l'utiliser où vous le souhaitez

#define RGBCOLOR(r,g,b)[UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]

Utiliser :

[lblCount setTextColor:RGBCOLOR(236, 43, 92)];
1
Hardik Thakkar

Je pense que cela vaut également la peine de mentionner une autre fonctionnalité géniale dont on parle rarement: les littéraux de couleur. Non seulement ils sont plus faciles à lire, mais ils sont beaucoup plus faciles à éditer. En rapide, 

let color: UIColor = #colorLiteral(red: 0.9607843137, green: 0.4784313725, blue: 0.3215686275, alpha: 

Lorsqu'elle est collée dans Xcode, cette syntaxe crée une boîte de couleur simple. Cliquez ici pour voir un exemple.

Une fois que vous voyez la boîte, vous pouvez alors double-cliquer dessus pour la modifier facilement. De même, vous pouvez basculer entre différentes options IB, y compris Curseurs RVB , si vous avez une liste spécifique de valeurs hexadécimales de couleur fournies par votre concepteur.

0
Jul3ia