Я хочу сделать что-то вроде этого, но я не могу получить совместный синтаксис.
static const UIColor *colorNavbar = [UIColor colorWithRed: 197.0/255.0 green: 169.0/255.0 blue: 140.0/255.0 alpha: 1.0];
Я предполагаю, что мог определить макросы, но они ужасны.
Мне нравится использовать категории для расширения классов с помощью новых методов для такого рода вещей. Вот отрывок кода, который я только что написал сегодня:
@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;
}
Вы также можете заставить макрос делать запоминание.
Я обычно делаю категорию UIColor для каждого проекта:
@interface UIColor (ProjectName)
+(UIColor *) colorForSomeTable;
+(UIColor *) colorForSomeControl;
+(UIColor *) colorForSomeText;
@end
С константами в реализации:
@implementation UIColor (ProjectName)
+(UIColor *) colorForSomeTable { return [UIColor colorWithRed:...]; }
@end
Я также делаю то же самое для UIFont и UIImage по мере необходимости.
Чтобы расширить ответ 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
в любом случае неизменен.