[iOS]一行代码集成空白页面占位图(基于runtime+MJRefresh思想)
LYEmptyView
此框架是本人在5,6个月前,公司启动新项目的时候,一起开始着手编写的,经过这个项目的验证与考验,不断的进行完善,在此特将这份框架分享出来供大家参考与学习。github地址
不需要遵循协议,不需要设置代理,不需要实现代理方法,只需这一句代码,就可为一个UITableViwe/UICollectionView集成空白页面占位图。self.tableView.ly_emptyView = [MyDIYEmpty diyNoDataEmpty];
目录
- 一 效果展示
- 二 使用参考示例
- 1 一行代码集成空内容视图
- 2 *选择空内容元素
- 3 自定义空内容元素
- 4 自定义元素的UI样式
- 5 二次封装
- 6 延迟显示emptyView
- 7 特殊需求,手动控制emptyView的显示隐藏
一 效果展示
二 使用参考示例
1 一行代码集成空内容视图
//框架方法
self.tableView.ly_emptyView = [LYEmptyView emptyViewWithImageStr:@"noData"
titleStr:@"暂无数据,点击重新加载"
detailStr:@""];
PS:可对框架进行二次封装,调用更简洁(二次封装方法在下面的示例5中会讲到)
//二次封装方法,调用简洁
self.tableView.ly_emptyView = [MyDIYEmpty diyNoDataEmpty];
完全低耦合,在你的项目中加入这一行代码就可集成 不管项目中是reloadData方法刷UI还是insert、delete等方式刷UI,不需做其他任何操作,只需这一行代码就可实现以下效果
2 *选择空内容元素
交互事件可选择SEL或block方式
SEL交互事件:
self.tableView.ly_emptyView = [LYEmptyView emptyActionViewWithImageStr:@"noData"
titleStr:@"无数据"
detailStr:@"请稍后再试!"
btnTitleStr:@"重新加载"
target:target
action:action];
block交互事件:
self.tableView.ly_emptyView = [LYEmptyView emptyActionViewWithImageStr:@"noData"
titleStr:@""
detailStr:@""
btnTitleStr:@""
btnClickBlock:^{}];
// imageStr : 占位图片
// titleStr : 标题
// detailStr : 详细描述
// btnTitleStr : 按钮标题
框架提供四个元素,传入相应元素的字符串即可显示对应元素(按钮的显示前提是传入target,action或btnClickBlock) 可根据项目需求,*进行组合,如下只展示了部分组合效果
3 自定义空内容元素
特殊情况下,如果空内容状态布局不满足需求时,可进行自定义 通过方法+ (instancetype)emptyViewWithCustomView:(UIView *)customView;
传入一个View 即可创建一个自定义的emptyView
self.tableView.ly_emptyView = [LYEmptyView emptyViewWithCustomView:customView];
4 自定义元素的UI样式
这里自定义UI样式需要很多代码,别担心,在示例5中会讲解二次封装的方式,封装后调用时就只需要一行代码了 ^ _ ^
//初始化一个emptyView
LYEmptyView *emptyView = [LYEmptyView emptyActionViewWithImageStr:@"noData"
titleStr:@"无数据"
detailStr:@"请稍后再试!"
btnTitleStr:@"重新加载"
btnClickBlock:^{}];
//元素竖直方向的间距
emptyView.subViewMargin = 20.f;
//标题颜色
emptyView.titleLabTextColor = MainColor(90, 180, 160);
//描述颜色
emptyView.detailLabTextColor = MainColor(180, 120, 90);
//按钮背景色
emptyView.actionBtnBackGroundColor = MainColor(90, 180, 160);
//设置空内容占位图
self.tableView.ly_emptyView = emptyView;
这里只列举了一些常用的属性,更多属性请到LYEmptyView.h查看
5 二次封装
第4小节的示例代码,修改emptyView的样式需要一个个属性单独去改,如果项目中每个界面都这么写就显得很麻烦,而且不易维护 解决办法是对库进行二次封装,二次封装后,对UI样式单独管理,方便维护
1)新建一个类继承自LYEmptyView,例如demo中的MyDIYEmpty
2)重写- (void)prepare
方法,并修改想要改变的元素的UI样式
- (void)prepare{
[super prepare];
self.titleLabFont = [UIFont systemFontOfSize:25];
self.titleLabTextColor = MainColor(90, 180, 160);
self.detailLabFont = [UIFont systemFontOfSize:17];
self.detailLabTextColor = MainColor(180, 120, 90);
self.detailLabMaxLines = 5;
self.actionBtnBackGroundColor = MainColor(90, 180, 160);
self.actionBtnTitleColor = [UIColor whiteColor];
}
操作上面的两步就可实现对样式的单独管理 调用方法不变,只是调用的类变成了MYDiyEmpty
self.tableView.ly_emptyView = [MYDiyEmpty emptyActionViewWithImageStr:@"noData"
titleStr:@"暂无数据"
detailStr:@"请稍后再试!"
btnTitleStr:@"重新加载"
btnClickBlock:^{}];
3)进一步封装显示的元素内容,比如无数据状态图、无网络状态图
在MYDiyEmpty.h定义方法+ (instancetype)diyNoDataEmpty;
在MYDiyEmpty.m实现方法
+ (instancetype)diyNoDataEmpty{
return [MyDIYEmpty emptyViewWithImageStr:@"noData"
titleStr:@"暂无数据"
detailStr:@"请稍后再试!"];
}
经过3步封装,自定义了UI样式,使管理更方便,使调用更简洁 self.tableView.ly_emptyView = [MyDIYEmpty diyNoDataEmpty];
下面的两种示例,属于特殊需求,需要四行代码搞定,调用和MJRefrsh类似,需要先设置样式,然后显示和隐藏
6 延迟显示emptyView
如示例1图,框架自动根据DataSource计算是否显示emptyView,在空页面发起网络请求时,DataSource肯定为空,会自动显示emptyView,有的产品需求可能不希望这样,希望发起请求时暂时隐藏emptyView。 本框架提供了两个方法可实现此需求,两个方法都是scrollView的分类,调用非常方便
/**
一般用于开始请求网络时调用,ly_startLoading调用时会暂时隐藏emptyView
当调用ly_endLoading方法时,ly_endLoading方法内部会根据当前的tableView/collectionView的
DataSource来自动判断是否显示emptyView
*/
- (void)ly_startLoading;
/**
在想要刷新emptyView状态时调用
注意:ly_endLoading 的调用时机,有刷新UI的地方一定要等到刷新UI的方法之后调用,
因为只有刷新了UI,view的DataSource才会更新,故调用此方法才能正确判断是否有内容。
*/
- (void)ly_endLoading;
*注意点:使用这两个方法,请先将emptyView的autoShowEmptyView属性置为NO,关闭自动显隐
以下是调用示例(具体细节可参考demo中的demo2)
//1.先设置样式
self.tableView.ly_emptyView = [MyDIYEmpty diyNoDataEmpty];
//2.关闭自动显隐(此步可封装进自定义类中,相关调用就可省去这步)
self.tableView.ly_emptyView.autoShowEmptyView = NO;
//3.网络请求时调用
[self.tableView ly_startLoading];
//4.刷新UI时调用(保证在刷新UI后调用)
[self.tableView ly_endLoading];
7 特殊需求,手动控制emptyView的显示隐藏
在某些特殊界面下,有的tableView/collectionView有固定的一些死数据,其它的数据根据网络加载,这时根据以上的示例方法可能达不到这需求。 本框架提供另外的两个方法来解决这个问题。
/**
手动调用显示emptyView
*/
- (void)ly_showEmptyView;
/**
手动调用隐藏emptyView
*/
- (void)ly_hideEmptyView;
*注意点:使用这两个方法,请先将emptyView的autoShowEmptyView属性置为NO,关闭自动显隐
以下是调用示例(具体细节可参考demo中的demo4)
//1.先设置样式
self.tableView.ly_emptyView = [MyDIYEmpty diyNoDataEmpty];
//2.关闭自动显隐(此步可封装进自定义类中,相关调用就可省去这步)
self.tableView.ly_emptyView.autoShowEmptyView = NO;
//3.显示emptyView
[self.tableView ly_showEmptyView];
//4.隐藏emptyView
[self.tableView ly_hideEmptyView];
github欢迎star 地址
[iOS]一行代码集成空白页面占位图(基于runtime+MJRefresh思想)的更多相关文章
-
iOS,一行代码进行RSA、DES 、AES、MD5加密、解密
本文为投稿文章,作者:Flying_Einstein(简书) 加密的Demo,欢迎下载 JAVA端的加密解密,读者可以看我同事的这篇文章:http://www.jianshu.com/p/98569e ...
-
一行代码在Linux服务器上搭建基于.Net Core的博客
如果你有一台Linux服务器(CentOS7+ 或者 Ubuntu 16.04+)可以使用以下命令快速搭建一个博客. curl http://cdn.zkeasoft.com/zkeacms-blog ...
-
一行代码实现自定义转场动画--iOS自定义转场动画集
WXSTransition 这款非常不错,力推 这是作者源码简书地址: http://www.jianshu.com/p/fd3154946919 这是作者源码github地址 https://git ...
-
零行代码为 App 添加异常加载占位图
前文提要 近期准备重构项目,需要重写一些通用模块,正巧需要设置App异常加载占位图的问题,心血来潮设想是否可以零行代码解决此问题,特在此分享实现思路. 思路分享 对于App占位图,通常需要考虑的控件有 ...
-
【原】iOS动态性(四):一行代码实现iOS序列化与反序列化(runtime)
为取得更好的排版效果,本文同样发布在简书上,强烈建议跳转到[1]http://www.jianshu.com/p/fed1dcb1ac9f 一.变量声明 为便于下文讨论,提前创建父类Biology以及 ...
-
iOS 3DES加密解密(一行代码搞定)
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...
-
一行代码实现iOS序列化与反序列化(runtime)
一.变量声明 为便于下文讨论,提前创建父类Biology以及子类Person: Biology: @interface Biology : NSObject { NSInteger *_hairCou ...
-
一行代码实现iOS序列化与反序列化
一.变量声明 为便于下文讨论,提前创建父类Biology以及子类Person: Biology: @interface Biology : NSObject { NSInteger *_hairCou ...
-
零行代码为App添加异常加载占位图
前文提要 近期准备重构项目,需要重写一些通用模块,正巧需要设置App异常加载占位图的问题,心血来潮设想是否可以零行代码解决此问题,特在此分享实现思路. 思路分享 对于App占位图,通常需要考虑的控件有 ...
随机推荐
-
Bash 会清空从父进程继承来的 OLDPWD
即便 Bash 没有从父进程继承任何的环境变量,Bash 自己也会创建三个环境变量,分别是: $ env -i bash -c export declare -x OLDPWD declare -x ...
-
INBOUND_CONNECT_TIMEOUT与SQLNET.INBOUND_CONNECT_TIMEOUT小结
关于sqlnet.ora的参数SQLNET.INBOUND_CONNECT_TIMEOUT,它表示等待用户认证超时的时间,单位是秒,缺省值是60秒,如果用户认证超时了,服务器日志alert.log显示 ...
-
【oracle】oracle启动和关闭步骤
前言: 首先要知道,Oracle数据库的完整启动过程是分步骤完成的,包含以下3个步骤: 启动实例-->加载数据库-->打开数据库 因为Oracle数据库启动过程中不同的阶段可以对数据库进行 ...
-
java和javascript双引号嵌套的问题
双引号不能嵌套双引号,否则一对双引号就结束了. java中双引号中嵌套双引号需要转义: /** * java双引号转义符测试 * @author asus * */ public static voi ...
-
shell获取本地ip的三种方法
第一种方法:ifconfig|grep inet |awk '{print $2}'|sed '2d'|awk -F : '{print $2}'第二种方法:ifconfig|grep inet|se ...
-
VueJs一些资料网站链接
https://github.com/liukaijv/laravel-vue-cmshttps://github.com/allan2coder/VUE2-SPA-Tutorialhttps://g ...
-
利用for循环求1-100之间的奇数和 and 0-100的偶数和
为了方便自己计算,以下代码只求1-10的奇数和 and 0-10的偶数和 1-10的奇数从1开始分别为1.3.5.7.9 代码如下 /* Name:循环语句得出奇数.偶数并相加求和 Copyright ...
-
POJ 2758 Checking the Text(Hash+二分答案)
[题目链接] http://poj.org/problem?id=2758 [题目大意] 给出一个字符串,支持两个操作,在任意位置插入一个字符串,或者查询两个位置往后的最长公共前缀,注意查询的时候是原 ...
-
mysql数据一致性检查及修复
percona-toolkit-2.2.20-1.noarchmysql 5.6.29-logmaster:192.168.166.129slave:192.168.166.131 一.创建数据库校验 ...
-
MySQL缓存之Qcache与buffer pool对比
Q:innodb buffer pool和Qcache的缓存区别? A: 1.Qcacche缓存的是SQL语句及对应的结果集,缓存在内存,最简单的情况是SQL一直不重复,那Qcache的命令率肯定是0 ...