Задача C, определяющая константы UIColor
У меня есть приложение iPhone с несколькими настраиваемыми цветами для моей темы. Поскольку эти цвета будут исправлены для моего пользовательского интерфейса, я бы хотел определить цвета в классе, который будет включен (Constants.h и Constants.m). Как мне это сделать? (Простое определение их не работает, потому что UIColors изменчивы и вызовут ошибки - Initalizer не является константой).
/* Constants.h */
extern UIColor *test;
/* Constants.m */
UIColor *test = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
Спасибо!
Ответы
Ответ 1
UIColor не изменяет. Обычно я делаю это с цветами, шрифтами и изображениями. Вы можете легко изменить его, чтобы использовать синглтоны или иметь статический инициализатор.
@interface UIColor (MyProject)
+(UIColor *) colorForSomePurpose;
@end
@implementation UIColor (MyProject)
+(UIColor *) colorForSomePurpose { return [UIColor colorWithRed:0.6 green:0.8 blue:1.0 alpha:1.0]; }
@end
Ответ 2
Для простоты я сделал это:
/* Constants.h */
#define myColor [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0]
Не забудьте оставить ";" поэтому вы можете использовать его как нормальное выражение.
Я не уверен, что с этим подходом что-то технически неправильно, но он отлично работает и избегает ошибки инициализатора постоянной времени компиляции - этот код эффективно застревает на месте, где бы вы ни разместили "myColor", t когда-либо компилируется до тех пор, пока вы его не используете.
Ответ 3
Другой вариант
в вашем .h вы можете сделать
extern UIColor * const COLOR_LIGHT_BLUE;
в вашем .mm вы можете сделать
UIColor* const COLOR_LIGHT_BLUE = [[UIColor alloc] initWithRed:21.0f/255 green:180.0f/255 blue:1 alpha:1];//;#15B4FF
Ответ 4
Если вы ищете быстрый и грязный без расширений, перейдите clang:
#define kGreenColor colorWithRed:(0/255.0) green:(213/255.0) blue:(90/255.0) alpha:1.0
- (void)doSomething
{
_label.textColor = [UIColor kGreenColor];
}
Ответ 5
Часто люди помещают глобальные константы в одноэлементные объекты - или, как указано на рисунке, вы можете сделать их доступными с помощью метода класса для некоторого класса.
Ответ 6
Здесь другой способ:
Заголовок:
#if !defined(COLORS_EXTERN)
#define COLORS_EXTERN extern
#endif
COLORS_EXTERN UIColor *aGlobalColor;
Реализация:
#define COLORS_EXTERN
#import "GlobalColors.h"
@interface GlobalColors : NSObject
@end
@implementation GlobalColors
+ (void)load
{
aGlobalColor = [UIColor colorWithRed:0.2 green:0.3 blue:0.4 alpha:1];
}
@end
Это немного взломанный, но вам не нужно переопределять цвет в реализации, и вы можете получить доступ к цветам без вызова метода.
Ответ 7
Используйте AppController, чтобы сделать цвета доступными во всем мире, а не статической переменной. Таким образом, это имеет смысл с точки зрения архитектуры, а также если вы хотите гипотетически изменить цветовые схемы, даже во время работы, это будет просто метод или два на AppController