在APP中,肯定會(huì)用到UILabel,例如標(biāo)題,內(nèi)容,腳注等等,都以文字內(nèi)容的形式進(jìn)行展示。此時(shí)A頁(yè)面有標(biāo)題,B頁(yè)面也有標(biāo)題,那么設(shè)計(jì)一個(gè)TitleLabel,是不是有必要?
個(gè)人覺(jué)得還是非常有必要的,雖然可能每個(gè)Label的定義也就多兩行字體和顏色的設(shè)定,但是如果APP有10處地方用到了標(biāo)題Label,那么你就需要重復(fù)10遍,同時(shí)對(duì)修改也極其不友好。
所以,一旦某一個(gè)控件需要以同樣的風(fēng)格出現(xiàn)在多個(gè)地方,那么我還是建議新建一個(gè)類(lèi)來(lái)定義。同時(shí),如果這個(gè)類(lèi)的風(fēng)格,可以通過(guò)配置文件來(lái)設(shè)置,那么就更加好了。
今天要推薦給大家的是SwiftTheme
目前iOS平臺(tái)上最方便的換膚框架,而且功能豐富、高性能、可擴(kuò)展,提供一個(gè)全新的換膚解決方案,使用純Swift編寫(xiě),但完全兼容OC。
結(jié)合SwiftTheme的plist模式,可以通過(guò)配置文件來(lái)定義每個(gè)控件的風(fēng)格。
目前大致的想法是這樣:以Label為例,首先需要定義INSLabel繼承UILabel,通過(guò)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會(huì)使用到Title,SubTitle,F(xiàn)ooter這三種不同風(fēng)格的Label,所以需要從INSLabel繼承,定義INSTitleLabel, INSSubTitleLabel, INSFooterLabel。此時(shí),再在Plist配置文件中添加并定義對(duì)應(yīng)的風(fēng)格即可,例如:

這樣看上去繼承層次略多了一些,所以也可以考慮用方法交換,取消掉INSTitle這一層。
又或者是否考慮可以定義一些自己的UI類(lèi)庫(kù)。