Question

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 ils sont laids.

Était-ce utile?

La solution

J'aime utiliser des catégories pour étendre les classes 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

dans le code, je peux faire des choses comme:

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

et mes propres couleurs définies se situent juste à côté de ceux définis par le système.

(Soit dit en passant, je commence à penser davantage en termes de HSB que RGB que je paie plus d'attention aux couleurs.)

Mise à jour concernant précalcul la valeur: Mon intuition est que ce n'est pas la peine. Mais si vous vouliez vraiment, vous pouvez memoize 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 faire une macro de faire le memoizing aussi.

Autres conseils

Je fais habituellement une catégorie de UIColor pour chaque projet:

@interface UIColor (ProjectName)

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

@end

Avec les constantes dans la mise en œuvre:

@implementation UIColor (ProjectName)

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

@end

Je fais aussi la même chose pour UIFont et UIImage au besoin.

Pour développer la réponse de jasoncrawford (je mettrais cela dans un commentaire, mais vous ne pouvez pas le code de format dans les commentaires) si vous voulez précalculer les valeurs (ou le faire qu'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 parce que le compilateur ne peut utiliser initialiseurs en dehors des fonctions, pas de code normal. Vous auriez pu atteindre quelque chose comme ce que vous vouliez avec initialize methosd par exemple.

static UIColor* colorNavBar = nil;

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

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

Vous pouvez 'définir' un CONSTANT semblable comme ceci:

#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 vous êtes habitué avec des constantes: FAV_COLOR

L'espoir qui aide.

Vous pouvez faire ceci:

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

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)
    }
}

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

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

myLabel.textColor=textColorApp;

Il suffit de définir ci-dessous macro dans votre fichier constant et passer que la valeur RVB et utiliser partout où vous voulez

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

Pour utiliser:

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

Je pense qu'il est aussi important de mentionner une autre caractéristique impressionnante qui est rarement parlé: Couleur littéraux. Non seulement ils sont plus faciles à lire, mais ils sont beaucoup plus faciles à modifier. Dans Swift,

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

Quand collé 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 double-cliquez dessus pour modifier facilement. De même, vous pouvez basculer entre les différentes options de l'IB, y compris RVB Sliders , si vous avez un liste spécifique des valeurs hexagonales de couleur de votre concepteur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top