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

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

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

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

60
задан Kevlar 4 June 2010 в 21:43
поделиться

3 ответа

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

@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;
}

Вы также можете заставить макрос делать запоминание.

125
ответ дан 24 November 2019 в 17:29
поделиться

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

@interface UIColor (ProjectName)

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

@end

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

@implementation UIColor (ProjectName)

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

@end

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

35
ответ дан 24 November 2019 в 17:29
поделиться

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

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

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

static UIColor* colorNavBar = nil;

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

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

11
ответ дан 24 November 2019 в 17:29
поделиться