在APP中,肯定会用到UILabel,例如标题,内容,脚注等等,都以文字内容的形式进行展示。此时A页面有标题,B页面也有标题,那么设计一个TitleLabel,是不是有必要?
个人觉得还是非常有必要的,虽然可能每个Label的定义也就多两行字体和颜色的设定,但是如果APP有10处地方用到了标题Label,那么你就需要重复10遍,同时对修改也极其不友好。
所以,一旦某一个控件需要以同样的风格出现在多个地方,那么我还是建议新建一个类来定义。同时,如果这个类的风格,可以通过配置文件来设置,那么就更加好了。
今天要推荐给大家的是SwiftTheme
目前iOS平台上最方便的换肤框架,而且功能丰富、高性能、可扩展,提供一个全新的换肤解决方案,使用纯Swift编写,但完全兼容OC。
结合SwiftTheme的plist模式,可以通过配置文件来定义每个控件的风格。
目前大致的想法是这样:以Label为例,首先需要定义INSLabel继承UILabel,通过SwiftTheme以Plist的方式配置字体和颜色。
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
NSString *classString = NSStringFromClass([self class]);
NSString *fontPath = [NSString stringWithFormat:@"%@.textFont", classString];
NSString *textColorPath = [NSString stringWithFormat:@"%@.textColor", classString];
self.theme_font = [ThemeFontPicker pickerWithKeyPath:fontPath map:^UIFont * _Nullable(id _Nullable map) {
NSString *fontString = (NSString *)map;
NSArray *stringArray = [fontString componentsSeparatedByString:@","];
return [UIFont fontWithName:stringArray[0] size:[stringArray[1] integerValue]];
}];
self.theme_textColor = [ThemeColorPicker pickerWithKeyPath:textColorPath];
}
return self;
}
此后,考虑APP会使用到Title,SubTitle,Footer这三种不同风格的Label,所以需要从INSLabel继承,定义INSTitleLabel, INSSubTitleLabel, INSFooterLabel。此时,再在Plist配置文件中添加并定义对应的风格即可,例如:
这样看上去继承层次略多了一些,所以也可以考虑用方法交换,取消掉INSTitle这一层。
又或者是否考虑可以定义一些自己的UI类库。