Чтобы добавить к тому, что говорили другие, есть видео WWDC по теме вашего кода. Я сделал этот шаг дальше и создал легкую основу для тезисов, которые я использую в нескольких своих приложениях. Суть заключается в следующем.
Каждый раз, когда вы создаете метку, кнопку и т. Д. (Или когда они появятся на экране, если вы используете построитель интерфейсов), вы передаете их экземпляру темы, который устанавливает их внешний вид. Если несколько компонентов пользовательского интерфейса работают вместе, используйте шаблон дизайна «Фасад», чтобы объединить их в один объект (например, если у вас есть кнопка, в которой есть обертка клиента, ярлык и изображение в определенном месте, заверните их в один класс называется, например, - WrappedButton).
Я иногда бывает легче общаться в UML, так что ...
Тема Протокол может выглядеть следующим образом.
@protocol Theme <NSObject>
- (void)themeHeadingLabel:(UILabel *)headingLabel;
- (void)themeBodyLabel:(UILabel *)bodyLabel;
- (void)themeNavigationButton:(UIButton *)navigationButton;
- (void)themeActionButton:(UIButton *)actionButton;
@end
Кстати, я обычно ставлю код там, чтобы кнопки, метки и т.д., чтобы реагировать на изменение размера текста (из приложения Settings) в iOS7. Так что может быть также такие методы, как,
- (void)respondToTextSizeChangeForHeadingLabel:(UILabel *)headingLabel;
- (void)respondToTextSizeChangeForBodyLabel:(UILabel *)bodyLabel;
// and do the same for buttons
Тогда, конечно, вы будете иметь один или несколько реализаций этого протокола. Здесь ваши темы будут жить. Вот несколько фрагментов того, что может выглядеть.
#import "Theme.h"
@interface LightTheme : NSObject <Theme>
@end
@implementation LightTheme
- (void)themeHeadingLabel:(UILabel *)headingLabel
{
headingLabel.backgroundColor = [UIColor lightTextColor];
headingLabel.textColor = [UIColor darkTextColor];
headingLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
}
// the rest of your theming
@end
И вы могли бы иметь темную тему, реализация которых выглядит примерно так.
@implementation DarkTheme
- (void)themeHeadingLabel:(UILabel *)headingLabel
{
headingLabel.backgroundColor = [UIColor darkGrayColor];
headingLabel.textColor = [UIColor lightTextColor];
headingLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
}
// the rest of your theming
@end
Я всегда обертку в ThemeManager, чтобы помочь мне следить за темой. Это может выглядеть примерно так.
#import "Theme.h"
@interface ThemeManager : NSObject
+ (id <Theme>)theme;
@end
#import "LightTheme.h"
#import "DarkTheme.h"
@implementation ThemeManager
+ (id <Theme>)theme
{
// here you'd return either your light or dark theme, depending on your program's logic
}
@end
Теперь, чтобы связать все это вместе, вы можете использовать его непосредственно или на заводе.
UILabel* headingLabel = [[UILabel alloc] init];
headingLabel.text = @"My Heading";
[[ThemeManager theme] themeHeadingLabel:myHeading];
// use the label
Или как фабрика, реализация будет выглядеть примерно так.
- (UILabel *)buildLabelWith:(NSString *)text
{
UILabel* headingLabel = [[UILabel alloc] init];
headingLabel.text = text;
[[ThemeManager theme] themeHeadingLabel:myHeading];
return headingLabel;
}
Надеюсь, что это поможет. Если у вас есть какие-либо вопросы, дайте мне знать.
Ознакомьтесь с нижеследующими ссылками: http: // stackoverflow.com/questions/8919334/how-to-create-multiple-themes-skins-for-iphone-apps http://stackoverflow.com/questions/7939981/how-to-switch-skins-or-design -themes-in-ios-app – PunjabiCoder