Вопрос по const, objective-c, cocoa-touch, uicolor – Как определить постоянные значения UIColor?

59

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

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

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

static UIColor *const color = .... возможно в Objective-C ++. Просто измените расширение на*.mm. Aleks N.
Да, Objective-C, чтобы быть более специфичным для языка - но это на iPhone в этом случае. mobibob

Ваш Ответ

9   ответов
1

Просто определите ниже макрос в вашем константном файле и передайте только значение RGB и используйте где угодно

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

Использовать :

[lblCount setTextColor:RGBCOLOR(236, 43, 92)];
Спасибо, но я все же предпочитаю избегать макросов. Мой любимый ответ - это категориальный ответ, так как он лучше используется языком. mobibob
пожалуйста, поделитесь своим кодом здесь Hardik Thakkar
Я сделал то же самое, но показал ожидаемую ошибку выражения в цели c Chandni
8

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

#define backgroundColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]
Я избегаю макро-решений, когда доступна более безопасная для типов или компилятора альтернатива. Вы можете заметить, что в моем первоначальном описании я признаю, что есть «макро» решение, но они «безобразны». В этом случае возникает безобразие, так как есть чистое решение, использующее функцию категории языка. mobibob
11

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

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

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

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

Использование макросов для констант - это плохо. Iulian Onofrei
kasperfn это то же самое, что ответ от Intorpedro (выше). Я предпочитаю избегать макросов. Мой любимый ответ - это категориальный ответ, так как он лучше используется языком. mobibob
@IulianOnofrei Есть какая-то конкретная причина? Почему макрос плохой? Есть ли проблемы с производительностью? Пожалуйста, кратко. Ganpat
Вы можете найти некоторую информациюВот. Iulian Onofrei
4
#define textColorApp [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0]

myLabel.textColor=textColorApp;
Извините - все еще макро решение Я предпочитаю решения Категории и расширяю класс UIColor. mobibob
Показать ожидаемое выражение ошибки в цели c Chandni
0

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

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

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

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

5

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

11

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

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

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

static UIColor* colorNavBar = nil;

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

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

Спасибо всем за все хорошие советы и приемы. Я, вероятно, буду следовать этому шаблону для некоторых других моих более специфических задач проектирования приложений. Я использую класс / категории, предложенные в первом посте Джейсона. Это позволяет элегантно определить класс темы различных цветов. mobibob
.. о да, что касается const на неизменяемых - да, получил это! спасибо за указание на это. mobibob
35

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

@interface UIColor (ProjectName)

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

@end

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

@implementation UIColor (ProjectName)

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

@end

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

Абсолютно здорово! Мой вспомогательный вопрос будет, где поставить этот код? У меня есть файлы Constants.h / Constants.m (в моих предварительно скомпилированных заголовках), и я просто хочу «объявить» постоянный цвет ... Мне не нравится помещать такой код там ... Где бы вы его поместили ? Andy M
ИМХО это путь. Johan Karlsson
124

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

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

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

также, если вы привыкли использовать RGB, например (255,255,255), вы можете изменить использование веб-интерфейса для перевода RGB в значение оттенка (serennu.com/colour/hsltorgb.php) или добавьте эту функцию в приведенный выше код+ (UIColor *)colorWithWebRed:(CGFloat)red Green:(CGFloat)green Blue:(CGFloat)blue { return [UIColor colorWithRed:red/255 green:green/255 blue:blue/255 alpha:1.0]; }  и использовать это так+ (UIColor *) aquaColor { return [UIColor colorWithWebRed:59 Green:89 Blue:152]; } drpawelo
Мне нравится этот подход. это завершает организацию, которую я ищу в определении использования. Я не был знаком с (Расширения), мне придется прочитать его, так как это может быть уместно для некоторых других классов, которые я использую. Наконец (возможно, получая OT), есть ли утилиты HSB 'picker', как есть сборщики RBG. Мне нравится IB, но я считаю полезным видеть вместе дополнительные цвета, так как довольно часто я хочу больше, чем один цвет за один раз. mobibob
Сохраните приведенный выше код в UIColor_MyColors.m, затем создайте UIColor_MyColors.h с помощью:#import <UIKit/UIKit.h> @interface UIColor () + (UIColor *) aquaColor; @end  чтобы использовать его, импортируйте UIColor_MyColors.h#import "UIColor_QuizColor.h"   и обратитесь к цвету, как это:[self.view setBackgroundColor: [UIColor aquaColor]]; drpawelo
Я добавил обновление, касающееся предварительного вычисления значения. jasoncrawford

Похожие вопросы