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

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

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

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

Ответ 1

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

@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, поскольку я больше обращаю внимание на цвета.)

ОБНОВЛЕНИЕ относительно предвычисления значения: Моя догадка заключается в том, что это не стоит. Но если вы действительно хотели, вы могли бы memoize значения со статическими переменными:

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

Вы можете сделать макрос, также сделайте memoizing.

Ответ 2

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

@interface UIColor (ProjectName)

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

@end

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

@implementation UIColor (ProjectName)

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

@end

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

Ответ 3

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

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

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

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

Ответ 4

Чтобы расширить ответ на 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 = ....
    }
}

NB спецификатор const в исходном определении является избыточным, поскольку UIColor в любом случае неизменен.

Ответ 5

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

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

Ответ 6

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

Используйте как: Label.background = UIColor.XXXWhiteColor()

Ответ 7

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

myLabel.textColor=textColorApp;

Ответ 8

Просто определите ниже макрос в своем постоянном файле и передайте только значение 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)];

Ответ 9

Я считаю, что также стоит упомянуть еще одну удивительную особенность, о которой редко говорят: Color Literals. Мало того, что их легче читать, но их легко редактировать. В Swift

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

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

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