Обновление: Я бы рекомендовал начать с понимания UIAppearance
API-интерфейсов и выяснить, насколько они соответствуют вашим потребностям. UIAppearance
- это удобный способ обеспечить пользовательскую стилизацию по умолчанию для атрибутов определенных элементов управления на нескольких уровнях (например, глобально или контекстуально).
Мой оригинальный ответ, который предшествовал доступности UIAppearance
:
так как мы работаем с объектно-ориентированным языком ...
для реализации, это зависит от того, как вы хотите, чтобы он вел себя / выполнял. когда реализация становится нетривиальной, я часто создаю протокол. Вы можете использовать методы класса или методы экземпляра и значительно оптимизировать эти типы для своего использования, поскольку вы создаете меньше промежуточных цветов, шрифтов, изображений и т. д.
базовый интерфейс может иметь вид:
@protocol MONLabelThemeProtocol
- (UIFont *)labelFont;
- (UIColor *)labelTextColor;
- (UITextAlignment)labelTextAlignment;
// ...
@end
@protocol MONTableViewCellThemeProtocol
- (UIFont *)tableViewCellFont;
- (UIColor *)tableViewCellTextColor;
- (UIImage *)tableViewCellImage;
- (NSInteger)tableViewCellIndentationLevel;
- (CGFloat)tableViewCellIndentationWidth;
// ...
@end
тогда простую объединенную тему можно объявить так:
@interface MONAmalgamateThemeBase : NSObject
< MONLabelThemeProtocol, MONTableViewCellThemeProtocol >
{
@protected
/* labels */
UIFont * labelFont;
UIColor * labelTextColor;
UITextAlignment labelTextAlignment;
// ...
/* table view cells */
UIFont * tableViewCellFont;
UIColor * tableViewCellTextColor;
UIImage * tableViewCellImage;
NSInteger tableViewCellIndentationLevel;
CGWidth tableViewCellIndentationWidth;
// ...
}
@end
в этом примере объединение определяет методы getter и dealloc и ожидает, что подклассы инициализируют переменные экземпляра. Вы также можете поддерживать отложенную инициализацию, если время инициализации велико (например, используется много изображений).
тогда специализация может иметь вид:
@interface MONDarkTheme : MONAmalgamateThemeBase
@end
@implementation MONDarkTheme
- (id)init
{
self = [super init];
if (nil != self) {
labelFont = [[UIFont boldSystemFontOfSize:15] retain];
labelTextColor = [[UIColor redColor] retain];
// and so on...
}
return self;
}
// ...
@end
/* declare another theme and set it up appropriately */
@interface MONLightTheme : MONAmalgamateThemeBase
@end
, а затем просто повторно используйте экземпляры темы (например, MONDarkTheme) во всем приложении, чтобы стилизовать представления. если у вас много тем или их нетривиально построить, то вы можете создать коллекцию тем (менеджер тем). объединение может также принимать параметр, такой как init с темой, если ваши потребности просты. Вы даже можете настроить объекты для регистрации изменений в темах, если вам нужна поддержка динамических изменений.
наконец, вы можете создать простой аппликатор темы, чтобы сделать жизнь проще - например, так:
@interface UILabel (MONThemeAdditions)
- (void)mon_applyMONLabelTheme:(id<MONLabelTheme>)theme;
@end
@implementation UILabel (MONThemeAdditions)
- (void)mon_applyMONLabelTheme:(id<MONLabelTheme>)theme
{
assert(theme);
if (nil == theme) return;
self.font = [theme labelFont];
self.textColor = [theme labelTextColor];
self.textAlignment = [theme labelTextAlignment];
}
@end