Как определить постоянные значения UIColor?


Я хочу сделать что-то подобное, но я не могу получить синтаксис кооператива.

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

Я полагаю, что я мог бы определить макросы, но они уродливы.

9 58

9 ответов:

мне нравится использовать категории для расширения классов с новыми методами для такого рода вещей. Вот отрывок кода, который я только что написал сегодня:

@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

Теперь в коде я могу делать такие вещи, как:

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

и мои собственные определенные цвета подходят прямо рядом с системными.

(кстати, я начинаю думать больше с точки зрения HSB, чем RGB, поскольку я уделяю больше внимания цветам.)

обновление относительно предварительного вычисления значения: Я подозреваю, что это того не стоит. Но если вы действительно хотите, вы можете запомнить значения со статическими переменными:

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

вы могли бы сделать макрос делать мемуары, тоже.

Я обычно делаю категорию UIColor для каждого проекта:

@interface UIColor (ProjectName)

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

@end

с константами в реализации:

@implementation UIColor (ProjectName)

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

@end

Я также делаю то же самое для UIFont и UIImage по мере необходимости.

чтобы расширить ответ jasoncrawford (я бы поставил это в качестве комментария, но вы не можете форматировать код в комментариях), если вы хотите предварительно вычислить значения (или сделать это только один раз).

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

причина, по которой ваша оригинальная идея не работает, заключается в том, что компилятор может использовать только инициализаторы вне функций, а не обычный код. Вы могли бы достичь чего-то вроде того, что вы хотели с инициализировать methosd например

static UIColor* colorNavBar = nil;

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

важно!const квалификатор на вашем оригинале определение избыточно, так как UIColor является неизменным в любом случае.

вы можете "определить" аналогичную константу следующим образом:

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

и называть его по имени, как вы привыкли с константами: FAV_COLOR

надеюсь, что это поможет.

вы можете сделать это:

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

В Swift: Определить расширение

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

использовать как: Этикетка.фон = 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;

просто определите ниже макрос в вашем постоянном файле и передать только значение RGB и использовать в любом месте вы хотите

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

использование :

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

Я чувствую, что также стоит упомянуть еще одну удивительную особенность, о которой редко говорят: литералы цвета. Их не только легче читать, но и легче редактировать. В Свифт,

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

при вставке в Xcode этот синтаксис создает простое цветовое поле. Щелкните здесь, чтобы увидеть пример.

Как только вы увидите поле, вы можете дважды щелкнуть по нему, чтобы легко отредактировать его. Кроме того, вы можете переключаться между различными вариантами IB, в том числе RGB Ползунки, если у вас есть определенный список цветовых шестнадцатеричных значений от вашего дизайнера.