文中列举的代码并不完整
源代码

在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特性,批量配置样式,内存缓存的代码可以见源代码,欢迎留言讨论。

UIView-Maker,实现UIView的clone操作和统一样式模型相关推荐

  1. ios uiview动画_iOS UIView动画

    ios uiview动画 In this tutorial, we'll be animating our UI Views in various ways in the iOS Applicatio ...

  2. html DOM操作表格及样式

    一 操作表格 // <table>标签是HTML中结构最为复杂的一个,我们可以通过DOM来创建生成它,或者HTMLDOM来操作它; 1 // 使用DOM来创建表格; 2     var t ...

  3. JavaScript DOM操作表格及样式

    一 操作表格 <table>标签是HTML中结构最为复杂的一个,我们可以通过DOM来创建生成它,或者HTMLDOM来操作它; 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

  4. jquery拼接后css样式不生效_JQuery常用选择器以及操作属性和样式的方法介绍

    JQuery日常操作有选择器,获取和操作属性,css样式,文本等等,下面是一些常用的操作,代码以图片形式(哈哈,其实还是我懒,大神别喷我,我还是渣渣),就是一些日常的学习笔记 JQuery中的属性选择 ...

  5. JavaScript基础13-day15【DOM增删改、DOM添加删除记录、操作内联样式、获取元素的样式、DOM Element 对象、滚动条练习、事件对象、div跟随鼠标移动、事件冒泡】

    学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...

  6. JavaScript--DOM操作表格及样式(21)

    一 操作表格 // <table>标签是HTML中结构最为复杂的一个,我们可以通过DOM来创建生成它,或者HTMLDOM来操作它; 1 // 使用DOM来创建表格; 2 var table ...

  7. 操作行内样式-对象语法//操作行内样式-数组语法

    操作行内样式-对象语法 <!DOCTYPE html> <html lang="en"><head><meta charset=" ...

  8. 联邦学习【分布式机器学习技术】【①各客户端从服务器下载全局模型;②各客户端训练本地数据得到本地模型;③各客户端上传本地模型到中心服务器;④中心服务器接收各方数据后进行加权聚合操作,得全局模型】

    随着计算机算力的提升,机器学习作为海量数据的分析处理技术,已经广泛服务于人类社会. 然而,机器学习技术的发展过程中面临两大挑战: 一是数据安全难以得到保障,隐私数据泄露问题亟待解决: 二是网络安全隔离 ...

  9. 第 10 节 操作内联样式

    第10节 操作内联样式 操作内联样式 操作内联样式 1.通过JS修改元素的样式: 1)语法:元素.style.样式名 = 样式值 注意: 如果CSS的样式名中含有 -,这种名称在JS中是不合法的,比如 ...

最新文章

  1. 线性回归之数学:求导公式
  2. 免费申领Bio-protocol单细胞研究实验方法精选集
  3. java数组遍历 删除remove
  4. python barrier option pricing_《Python金融数据分析》书内代码实战与讲解(二)金融衍生物定价...
  5. csp php,CSP学习笔记(持续学习更新)
  6. linux ie8找不到,ie浏览器不见了怎么办 三种方法搞定【图文教程】
  7. 20172325 2018-2019-1 《Java程序设计》第二周学习总结
  8. 如何做到毫秒级从百亿大表任意维度筛选数据?| 技术头条
  9. 【CLR】解析CLR的托管堆和垃圾回收
  10. 证券词汇集锦(中英文+注释版)
  11. 2020秋招阿里测试开发一面
  12. 北京最最最牛的IT公司都在这了 。。。
  13. 推荐一款好用的免费云服务器
  14. 戴尔(Dell)笔记本电脑开机后插上耳机没反应怎么办
  15. 黑麦4k可以安装Linux,全高清屏你就满足了?GTX1050Ti+4K屏麦本本黑麦5X颠覆你的视界...
  16. VMware16安装CentOS7 并配置网络(步骤详细)
  17. 163电子邮箱注册登录入口是?企业邮箱和163邮箱有什么区别?
  18. 实现一个简单的语音聊天室(源码)
  19. set、map与模块化
  20. 嵌入式linux 不识别sata,sata硬盘识别不了的常见问题和解决方法

热门文章

  1. [已解决] InnoDB: preallocating bytes for file ./ibdata1 failed with error
  2. SYSAUX表空间使用率高问题处理
  3. 教你写一个可以找到.m文件所有接口名的命令行工具
  4. openstack学习笔记三 创建第一个实例
  5. [AS3 3D Demo] Stage3D学习过程中开发的3个Demo
  6. 【.Net Micro Framework PortingKit - 03】调试初步:点亮LED灯
  7. Enterprise Library 3.0 体验(3):使用配置文件的Validation Application Block
  8. php 回复可见,Typecho完美实现回复可见功能
  9. servlet文件上传blob_servlet实现从oracle数据库的blob字段中读出文件并显示 | 学步园...
  10. 互联网协议 — 动态路由协议类型