这个小程序可以让您对iOS应用进行主题化,简单又干净。最初创建它的目的是为了能让NIB文件使用通知更新视图属性,如字体和颜色。后来我扩展了NIB的支持,使得无论您如何创建视图,它都会响应您的主题。
我还想创建一个借助于Xcode(只要安装了Xcode,任何人都可以轻松编辑您的主题Plists而不会减缓开发过程)就可以使用的库,供非APP开发人员(例如设计师)使用。
唯一的设置要求是您创建一个名为default.plist
的Plist文件。此文件的根应为字典。每个键代表一个属性名称。值应该是字体名称、字体大小或十六进制颜色代码。
点击这里查看iOS 6中包含的字体列表和示例http://iosfonts.com。
您可以在项目中包含自定义字体,并在主题中使用它们,就像使用系统字体一样。有关导入自定义字体的说明,请参阅此Stackoverflow回答。
RNThemeManager会自动根据字体关键词构建字体和大小。每个字体名称都必须有一个字体大小键,其值为强名称后缀为"Size"。例如
headerFont : ArialRoundedMTBold
headerFontSize : 24
然后当分配一个字体键给标签(或任何其他带文本的视图)时,大小将自动分配。
- (UIFont *)fontForKey:(NSString*)key;
颜色相当简单,只需将十六进制颜色代码用作键值即可。不需要以#
开头。
- (UIImage *)imageForKey:(NSString *)key;
这与[UIImage imageNamed:@"name"]
类似,只需将您资产的图像名称作为图像键的值即可。
- (UIImage *)imageForKey:(NSString *)key;
如果您要使用单个值作为多个键,请将一个键的值设置为另一个键。
headerFont : Helvetica
headerFontSize : 20
backgroundColor : ffffff
redColor : d81417
headerColor : backgroundColor
headerButtonColor : headerColor
cellHeaderFontSize : headerFontSize
buttonBackgroundColor : redColor
// etc
在NIB中应用主题分为三个步骤。所有这些操作都在身份检查器中进行(⌥ ⌘ 3)。
RNTheme
子类。您也可以将任何 RNTheme
类子类化。RNTheme*
子类匹配的关键路径键。如果这有点复杂,请看以下图片。
@interface RNThemeButton : UIButton
<RNThemeUpdateProtocol>
// available theme keys
@property (nonatomic, strong) NSString *backgroundImageKey;
@property (nonatomic, strong) NSString *backgroundColorKey;
@property (nonatomic, strong) NSString *fontKey;
@property (nonatomic, strong) NSString *textColorKey;
@property (nonatomic, strong) NSString *highlightedTextColorKey;
@end
// in -viewDidLoad (remember to removeObserver in -dealloc)
[[NSNotificationCenter defaultCenter] addObserver:self action:@selector(applyTheme) withObject:nil];
// in -viewWillAppear (or where you do your layout bits)
[self applyTheme];
- (void)applyTheme {
// these objects do _not_ need to be RNTheme* classes/subclasses
self.view.backgroundColor = [[RNThemeManager sharedManager] colorForKey:@"backgroundColor"];
self.textField.font = [[RNThemeManager sharedManager] fontForKey:@"textFieldFont"];
// example of custom theming
self.textField.layer.cornerRadius = [RNThemeManager sharedManager].styles[@"cornerRadius"].floatValue;
}
现在每当你修改主题文件时,ViewController将会自动根据你的主题设置重新样式化你的视图。
要更改活动主题,只需调用以下方法
[[RNThemeManager sharedManager] changeTheme:@"lowcontrast"];
确保你有一个包含你所提供的主题名称的 plist。
所有 RNTheme*
子类在主题更改时都会订阅通知,并符合一个名为 RNThemeUpdateProtocol
的自定义协议(该协议仅存在于语义上)。
如果你不使用任何 RNTheme*
视图(当然你也不需要),你可以通过监听以下通知来更新你的视图或甚至是视图控制器
RNThemeManagerDidChangeThemes
当发送此通知时,主题文件已经更改,应该使用主题样式的所有视图都将被更新。以下 RNThemeTextField
的一部分展示了我是如何更新我的视图的
// Somewhere in an -init or -viewDidLoad
// Make sure you remove the observer!
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(themeDidChangeNotification:)
name:RNThemeManagerDidChangeThemes
object:nil];
// ...
- (void)themeDidChangeNotification:(NSNotification *)notification {
[self applyTheme];
}
// Note: This is the required method of the RNThemeUpdateProtocol protocol
- (void)applyTheme {
UIFont *font = nil;
if (self.fontKey && (font = [[RNThemeManager sharedManager] fontForKey:self.fontKey])) {
self.font = font;
}
UIColor *textColor = nil;
if (self.textColorKey && (textColor = [[RNThemeManager sharedManager] colorForKey:self.textColorKey])) {
self.textColor = textColor;
}
}
RNThemeManager 是由 Ryan Nystrom 开发的,采用 MIT 许可。有关详细信息,请参阅许可文档。