Внешние константы для UIColor, UIFont и т. Д.

У меня есть файл constants.m, который представляет собой централизованный сборник многих программных констант. Чтобы установить цвет, я делаю так:

@implementation UIColor (UIColor_Constants) 

+(UIColor *) defaultResultTableBackgroundColor{
    //return [[UIColor colorWithRed:0.6f green:0.004f blue:0.0f alpha:1.0f] retain];
    return [[UIColor colorWithRed:0.1f green:0.004f blue:0.3f alpha:0.3f] retain];
}

+(UIColor *) defaultResultHeaderBackgroundColor{
    return [[UIColor clearColor] retain];
}

@end

и в constants.h у меня есть

@interface UIColor (UIColor_Constants) 

+(UIColor *) defaultResultTableBackgroundColor;
+(UIColor *) defaultResultHeaderBackgroundColor;

@end

а затем просто используйте [UIColor defaultResultTableBackgroundColor] там, где я хочу указать эту константу.

Я хотел бы иметь некоторые другие константы UIColor и UIFont, и, хотя это работает, это кажется более сложным, чем должно быть. Есть ли более простой способ сделать это?


person Jim    schedule 19.08.2011    source источник


Ответы (5)


Мне это тоже нравится. Один вопрос: почему вы сохраняете uicolor? Это очень опасно. Очень вероятно, что произойдет ошибка и возникнет утечка памяти.

person lbrndnr    schedule 19.08.2011
comment
Сохранение экземпляра UIColor было бы правильным, если бы он сохранял его в статической переменной для повторного использования. Как бы то ни было, вы правы: сохранять его, а затем просто возвращать неправильно. - person Peter Hosey; 20.08.2011

Для той же цели я использую файл констант. Вместо того, чтобы настраивать весь интерфейс и файл реализации, я создаю файл констант как файл заголовка (.h). Затем я определяю цвета, которые хочу использовать, например:

#define globalColor [UIColor colorWithRed:0.1f green:0.004f blue:0.3f alpha:0.3f]

Тогда всякий раз, когда вы используете globalColor, это похоже на ввод определенного кода.

person superjessi    schedule 19.08.2011
comment
Это не константа. Это макрос; компилятор по существу использует этот фрагмент кода для замены всех экземпляров globalColor в вашем коде. Функционально это сильно отличается от константы; практически то же самое. - person chris stamper; 11.12.2014
comment
Как вы используете этот глобальный цвет в своем приложении - person Chandni; 10.07.2018

Вот отличное чтение, объясняющее константы в Objective C:

Как лучше всего создавать константы в Objective -C

Краткий ответ: вы справляетесь с этим наилучшим образом.

Использование макросов не рекомендуется. Как уже упоминалось, вы можете # определить макрос для обработки ваших цветов. По сути, это указывает препроцессору выполнить поиск и замену в вашем коде. У этого подхода есть ряд недостатков, включая объем и тип. Apple категорически не рекомендует использовать эти типы "констант": https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html.

Также можно создать константу:

(в вашем заголовке, область файла)

extern UIColor *  const COLOR_LIGHT_BLUE;

(в вашей реализации область файла)

UIColor* const COLOR_LIGHT_BLUE = [[UIColor alloc] initWithRed:21.0f/255 green:180.0f/255  blue:1 alpha:1];

Вы можете, конечно, # импортировать этот заголовок в свой заголовок префикса, чтобы сэкономить еще больше ввода. В конечном счете, однако, это не намного лучше того, что вы уже делаете.

person chris stamper    schedule 10.12.2014
comment
Ответ на этот вопрос побудил меня узнать больше о c const. Вы можете (надеюсь) получить подробности здесь: stackoverflow.com/questions/27413196/ - person chris stamper; 11.12.2014

Вы создаете постоянный файл заголовка, который содержит все ваши цвета и / или шрифты вроде этого:

// Define a convenient macro for example
#define HEXCOLOR(c) [UIColor colorWithRed:((c>>16)&0xFF)/255.0 \
                                    green:((c>>8)&0xFF)/255.0 \
                                     blue:c&0xFF/255.0 \
                                    alpha:0xFF/255.0]

// Then define your constants
#define DefaultResultTableBackgroundColor HEXCOLOR(0x151515)
// etc.
person Yannick Loriot    schedule 19.08.2011
comment
Очень хорошо. Все, что я сделал для своих целей, это удалил точки с запятой с концов, и мне пришлось изменить c & 0xFF на (c & 0xFF), чтобы исправить ошибку компиляции. Таким образом я могу сделать borderColor = [DarkBlue CGColor]; Где DarkBlue - это определение HEXCOLOR .. с точкой с запятой, которая не работает. - person eselk; 03.10.2012
comment
@eselk, нет необходимости ставить точку с запятой после оператора #define: #define HEXCOLOR (c) [UIColor colorWithRed: ((c ›› 16) & 0xFF) /255.0 \ green: ((c ›› 8) & 0xFF) /255.0 \ blue: c & 0xFF / 255.0 \ alpha: 0xFF / 255.0] Если вы сделаете таким образом, вы сможете использовать [DarkBlue CGColor] и DarkBlue.CGColor - person Dennis Pashkov; 18.09.2014
comment
@DennisPashkov Спасибо за подсказку! - person Yannick Loriot; 18.09.2014
comment
На самом деле это не константа, UIColor будет воссоздаваться каждый раз при каждом обращении к нему. - person Maciej Swic; 10.12.2014
comment
Это не константа, и я уверен, что есть много веских причин не использовать макросы вместо констант. - person chris stamper; 11.12.2014

Ответ очень простой. Его можно использовать для NSArray, NSDictionary и т. Д.

//Font
static UIFont *titleFont() {
    static UIFont *font = nil;
    if (!font) {
        font = [UIFont systemFontOfSize:25 weight:UIFontWeightHeavy];
    }
    return font;
}

//Color
static UIColor *prettyPurpleColor() {
    static UIColor *color = nil;
    if (!color) {
        color = [[UIColor purpleColor] colorWithAlphaComponent:0.35];
    }
    return color;
}
person WINSergey    schedule 12.07.2016