2013-08-04 5 views
0

Я хочу иметь 30+ постоянных UIColors, поэтому я могу легко получить к ним доступ в своем приложении. Я хотел бы иметь возможность сделать что-то вроде этого:Где я могу хранить 30+ UIColors для быстрой справки?

[self setBackgroundColor:[UIColor skyColor]]; 
[self setBackgroundColor:[UIColor dirtColor]]; 
[self setBackgroundColor:[UIColor yankeesColor]]; 

Как это сделать?

Спасибо!

ответ

14

Определить категорию для UIColor:

В UIColor + MyColors.h:

@interface UIColor (MyColors) 

+ (UIColor *)skyColor; 
+ (UIColor *)dirtColor; 
// and the rest of them 

@end 

В UIColor + MyColors.m:

@implementation UIColor (MyColors) 

+ (UIColor *)skyColor { 
    static UIColor color = nil; 
    if (!color) { 
     // replace r, g, and b with the proper values 
     color = [UIColor colorWithRed:r green:g blue:b alpha:1]; 
    } 

    return color; 
} 

+ (UIColor *)dirtColor { 
    static UIColor color = nil; 
    if (!color) { 
     // replace r, g, and b with the proper values 
     color = [UIColor colorWithRed:r green:g blue:b alpha:1]; 
    } 

    return color; 
} 

// and the rest 

@end 

Edit:

Как Martin R указывает, более современный подход к инициализации статической color переменной будет:

+ (UIColor *)skyColor { 
    static UIColor color = nil; 
    static dispatch_once_t predicate = 0; 

    dispatch_once(&predicate, ^{ 
     // replace r, g, and b with the proper values 
     color = [UIColor colorWithRed:r green:g blue:b alpha:1]; 
    }); 

    return color; 
} 

Это на самом деле может быть излишним в этом случае, так как нет плохой побочный эффект, если два потока выполняют инициализацию статической переменной nil в то же время с использованием исходного кода. Но лучше использовать dispatch_once.

+0

Почему вы используете статическую переменную цвета вместо того, чтобы возвращать результат colorWithRed: green: blue: alpha? Скорость для последующих запросов? Разве цвет var не будет переопределен каждый раз, когда запрашивается новый цвет? – JeffRegan

+2

@JeffCompton Я использовал статику, поэтому цвет создается только один раз. Это небольшая оптимизация. Каждый статический объект привязан к методу, в котором он находится, поэтому они не мешают друг другу. Не отличается от наличия нестатической переменной с тем же именем двумя разными способами. – rmaddy

+1

Примечание. Использование 'dispatch_once()' может быть более «современным» способом и сделает инициализацию потокобезопасной. –

1

Вы можете добавить строки, как это:

#define kFirstColor [UIColor whiteColor] 
#define kSecondColor [UIColor colorWithRed:100.0/255 green:100.0/255 blue:100.0/255 alpha:1.0] 

В начале класса или добавить Color.h заголовок вашего проекта и импортировать его в случае необходимости.

#import "Color.h" 

Затем вы можете использовать свои собственные цвета так:

self.view.backgroundColor = kSecondColor; 
+6

Использование этого способа делает код более сложным для понимания в том смысле, что директива препроцессора маскирует истинный тип/характер kFirstColor и т. Д. Подход @ rmaddy более подробен, но является лучшим решением с точки зрения четкости и производительности кода. –

+2

@Beppe Это подход, это просто не очень хороший. Вероятно, отрицательное голосование указывает на это. Отрицательные голоса не обязательно означают, что ответ был неправильным, только то, что он не был так хорош, как другой ответ. Лично я считаю, что голосование по правильному ответу будет лучше, но каждый пользователь SO имеет свой собственный подход к точкам. – memmons

+2

#define не очень плохой подход. Код короток (по одной строке на цвет), потокобезопасный, безопасный по типу, легко понятный и модифицируемый. Есть места, где #defines могут вызвать программистов, но это не похоже на один из них. – EricS

Смежные вопросы