Как определить постоянные значения UIColor? - PullRequest
59 голосов
/ 27 апреля 2010

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

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

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

Ответы [ 9 ]

124 голосов
/ 27 апреля 2010

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

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

Вы также можете сделать макрос, чтобы сделать памятку тоже.

35 голосов
/ 27 апреля 2010

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

@interface UIColor (ProjectName)

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

@end

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

@implementation UIColor (ProjectName)

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

@end

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

11 голосов
/ 28 мая 2013

Вы можете «определить» похожую константу следующим образом:

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

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

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

11 голосов
/ 27 апреля 2010

Чтобы расширить ответ 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 в любом случае является неизменным.

8 голосов
/ 30 декабря 2011

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

#define backgroundColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]
5 голосов
/ 19 апреля 2015

В Свифте: Определить расширение

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

4 голосов
/ 11 апреля 2014
#define textColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]

myLabel.textColor=textColorApp;
1 голос
/ 23 сентября 2015

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

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

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

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

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

...