文中列举的代码并不完整
源代码
在iOS的开发中,对于页面偏多的中大型项目来说,使用纯storyboard进行页面构建是比较痛苦的,所有的困难中,首当其冲的是批量修改控件样式。虽然Apple的工程师提供了像appearance
这样的特别技术帮助大家批量配置样式,但面对庞大的项目仍有一定的局限性。
处于这种考虑,我们可以尝试扩展UIView的Category,方便我们在软件启动阶段,将所需要的某种大量使用的控件进行缓存,在使用时直接进行克隆操作,减少了代码中重复设置样式的步骤,同时方便后期进行批量样式修改。
首先第一步,我们要实现UIView的clone(克隆)操作
如何clone一个UIView? 使用 NSKeyedArchiver/NSKeyedUnarchiver
核心代码:
+ (__kindof UIView*)duplicate:(__kindof UIView*)view
{
NSData * tempArchive = [NSKeyedArchiver archivedDataWithRootObject:view];
return [NSKeyedUnarchiver unarchiveObjectWithData:tempArchive];
}
接下来,我们可以使用 - (__kindof UIView*)clone;
方法来克隆一个UIIView
- (UIView *)clone
{
return [[self class] duplicate:self];
}
将UIView注册为标准模版
我们可以设置key作为模版的标识, 然后使用make block
来配置UIView的样式。
+ (void)registStyle:(NSString*)key make:(void(^)(id view))makeBlock;
举个例子,这里使用的是MDCButton:
[MDCButton registStyle:@"category_button" make:^(MDCButton* _Nonnull view) {
view.frame = CGRectMake(15, 30, 50, 50);
[view setBackgroundColor:[UIColor add_colorWithRGBHexString:@"#178EDA"] forState:UIControlStateNormal];
}];
当我们需要实例化 category_button
的时候:
MDCButton* clone = [MDCButton cloneForKey:@"category_button"];
实现相同样式多个控件的布局
使用 copyTimes
方法来clone并布局多个相同样式的UIView:
- (void)copyTimes:(NSUInteger)times make:(void(^)(id view, NSUInteger idx))makeBlock;
举个例子,排列10个相同的UILabel:
UILabel* label = [[UILabel alloc] init];
[label copyTimes:10 make:^(id _Nonnull view, NSUInteger idx) {
[self.view addSubview:view];
[view setFrame:CGRectMake(0, idx * 100, 50, 100)];
}];
小结
本文中用到了NSKeyedArchiver/NSKeyedUnarchiver序列化/反序列化操作,来实现UIView对象的克隆,然后使用的语言block特性,批量配置样式,内存缓存的代码可以见源代码,欢迎留言讨论。