GTEmptyView
- 无需遵守协议,无需设置代理,无需实现代理方法,只需添加一行代码,就可以为 UITableViwe/UICollectionView 集成空白页面占位图。
self.tableView.gt_emptyView = [MyDIYEmpty diyNoDataEmpty];
- 一句话集成 LoadingView
self.tableView.gt_loadingView = [MyDIYLoading diyImageArrayLoading];
注: 除 UITableViwe/UICollectionView 外,这些 View(包括 UIScrollView)没有 DataSource,代码层面无法判断有无数据,需要手动管理显示隐藏。调用示例请参考示例 9
特点 | 描述 |
---|---|
与项目完全解耦 | 在需要集成的界面中加入一行代码即可集成,与原代码没有耦合度 |
0学习成本 | 无需关注视图的显示隐藏时机,只需加入一行代码即可,框架监听系统刷新 UI 的方法,自动计算后显示或隐藏 |
调用简单 | 使用分类和 runtime,调用简单 |
高度自定义 | 利用继承特性,可以二次封装框架,使自定义更方便 |
支持全部的刷新方法 | 如 reload...、insert...、delete...等方法。当项目中调用这些刷新方法时,该框架会根据 DataSource 自动计算是否显示 emptyView |
目录
- 一-效果展示
- 二-集成方式
- 三-使用参考示例
* 1-一行代码集成空内容视图
* 2-一行代码集成加载内容视图
* 3-自由选择空内容元素
* 4-自定义空内容元素
* 5-自定义元素的 UI 样式
* 6-二次封装
* 7-延迟显示emptyView
* 8-特殊需求,手动控制emptyView的显示隐藏
* 9-scrollView调用示例
一-效果展示
二-集成方式
1. Cocoapods方式集成: pod 'GTEmptyView'
使用时导入头文件 #import <GTEmptyView/GTEmptyViewHeader.h>
2. 手动下载集成: 将GTEmptyView文件夹,导入你的工程
使用时导入头文件:#import "GTEmptyViewHeader.h"
三-使用参考示例
1-一行代码集成空内容视图
//框架方法
self.tableView.gt_emptyView = [GTEmptyView emptyViewWithImageStr:@"noData"
titleStr:@"暂无数据,点击重新加载"
detailStr:@""];
PS:可对库进行二次封装,调用更简洁(二次封装方法在下面的示例5中会介绍)
//二次封装方法,调用简洁
self.tableView.gt_emptyView = [MyDIYEmpty diyNoDataEmpty];
完全低耦合,在你的项目中加入这一行代码即可集成
不管项目中是reloadData方法刷UI还是insert、delete等方式刷UI,不必做其他任何操作,只需这一行代码就能实现以下效果
2-一行代码集成加载内容视图
//框架方法
self.tableView.gt_loadingView = [GTLoadingView loadingViewWithLoadingAnimationType:GTLoadingAnimationTypeDot
titleStr:@"加载中"];
PS:可对库进行二次封装,调用更简洁(二次封装方法在下面的示例5中会介绍)
//二次封装方法,调用简洁
self.tableView.gt_emptyView = [MyDIYEmpty diyNoDataEmpty];
完全低耦合,在你的项目中加入这一行代码即可集成
不管项目中是reloadData方法刷UI还是insert、delete等方式刷UI,不必做其他任何操作,只需这一行代码就能实现以下效果
3-自由选择空内容元素
交互事件可选择SEL或block方式
self.tableView.gt_emptyView = [GTEmptyView emptyActionViewWithImageStr:@"noData"
titleStr:@"无数据"
detailStr:@"请稍后再试!"
btnTitleStr:@"重新加载"
target:target
action:action];
self.tableView.gt_emptyView = [GTEmptyView emptyActionViewWithImageStr:@"noData"
titleStr:@""
detailStr:@""
btnTitleStr:@""
btnClickBlock:^{}];
// imageStr : 占位图片
// titleStr : 标题
// detailStr : 详细描述
// btnTitleStr : 按钮标题
框架提供了四个元素,传入相应元素的字符串即可显示对应元素(按钮的显示前提是传入target、action或btnClickBlock),可依据项目需求自由组合,以下仅展示了部分组合效果
4-自定义空内容元素
在特殊情况下,如果空内容状态布局不满足需求时,可以进行自定义
通过方法+ (instancetype)emptyViewWithCustomView:(UIView *)customView;
传入一个View即可创建一个自定义的emptyView
self.tableView.gt_emptyView = [GTEmptyView emptyViewWithCustomView:customView];
5-自定义元素的UI样式
这里自定义UI样式需要很多代码,别担心,在示例5中会讲解二次封装的方式,封装后调用时就只需要一行代码了 ~_^
//初始化一个emptyView
GTEmptyView *emptyView = [GTEmptyView emptyActionViewWithImageStr:@"noData"
titleStr:@"无数据"
detailStr:@"请稍后再试!"
btnTitleStr:@"重新加载"
btnClickBlock:^{}];
//元素竖直方向的间距
emptyView.subViewMargin = 20.f;
//标题颜色
emptyView.titleLabTextColor = MainColor(90, 180, 160);
//描述字体
emptyView.detailLabFont = [UIFont systemFontOfSize:17];
//按钮背景色
emptyView.actionBtnBackGroundColor = MainColor(90, 180, 160);
//设置空内容占位图
self.tableView.gt_emptyView = emptyView;
这里只列举了一些常用的属性,更多属性请到GTEmptyView.h查看
6-二次封装
第5小节的示例代码,修改emptyView的样式需要一个个属性单独去改,如果项目中每个界面都这样写就显得很麻烦,而且不易维护
解决办法是对库进行二次封装,二次封装后,对UI样式单独管理,方便维护
1)新建一个类继承自GTEmptyView,例如demo中的MyDIYEmpty
- (void)prepare
方法,并修改想要改变的元素的UI样式
2)重写- (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.gt_emptyView = [MyDIYEmpty emptyActionViewWithImageStr:@"noData"
titleStr:@"无数据"
detailStr:@"请稍后再试!"
btnTitleStr:@"重新加载"
btnClickBlock:^{}];
在MyDIYEmpty.h中定义方法+ (instancetype)diyNoDataEmpty;
在MyDIYEmpty.m中实现方法
+ (instancetype)diyNoDataEmpty{
return [MyDIYEmpty emptyViewWithImageStr:@"nodata"
titleStr:@"暂无数据"
detailStr:@"请检查您的网络连接是否正确!"];
}
通过这三步封装,自定义了UI样式,使管理更方便,使调用更简洁
self.tableView.gt_emptyView = [MyDIYEmpty diyNoDataEmpty];
7-延迟显示emptyView
如图例1所示,框架将根据DataSource自动计算是否显示emptyView,当空页面发起网络请求时,DataSource必然为空,将自动显示emptyView。但某些产品可能不希望这样,希望请求时暂时隐藏emptyView。本框架提供两种方法实现此需求,两种方法都是scrollView的分类,调用非常方便。
/**
一般用于开始请求网络时调用,gt_startLoading调用时会暂时隐藏emptyView
当调用gt_endLoading方法时,gt_endLoading方法内部会根据当前的tableView/collectionView的
DataSource来自动判断是否显示emptyView
*/
- (void)gt_startLoading;
/**
在想要刷新emptyView状态时调用
注意:gt_endLoading 的调用时机,有刷新UI的地方一定要等到刷新UI的方法之后调用,
因为只有刷新了UI,view的DataSource才会更新,故调用此方法才能正确判断是否有内容。
*/
- (void)gt_endLoading;
*注意事项:使用这两种方法时,请首先将emptyView的autoShowEmptyView属性设置为NO,关闭自动显示/隐藏。
以下是调用示例(具体细节可参考demo中的demo2)
//1.先设置样式
self.tableView.gt_emptyView = [MyDIYEmpty diyNoDataEmpty];
//2.关闭自动显隐(此步可封装进自定义类中,相关调用就可省去这步)
self.tableView.gt_emptyView.autoShowEmptyView = NO;
//3.网络请求时调用
[self.tableView gt_startLoading];
//4.刷新UI时调用(保证在刷新UI后调用)
[self.tableView gt_endLoading];
8-特殊需求,手动控制emptyView的显示隐藏
在某些特殊界面下,某些tableView/collectionView有固定的死数据,其余数据根据网络加载,这时根据以上示例方法可能无法满足需求。
本框架提供另外两个方法来解决这个问题。
/**
手动调用显示emptyView
*/
- (void)gt_showEmptyView;
/**
手动调用隐藏emptyView
*/
- (void)gt_hideEmptyView;
*注意事项:使用这两种方法时,请首先将emptyView的autoShowEmptyView属性设置为NO,关闭自动显示/隐藏。
以下是调用示例(具体细节可参考demo中的demo4)
//1.先设置样式
self.tableView.gt_emptyView = [MyDIYEmpty diyNoDataEmpty];
//2.关闭自动显隐(此步可封装进自定义类中,相关调用就可省去这步)
self.tableView.gt_emptyView.autoShowEmptyView = NO;
//3.显示emptyView
[self.tableView gt_showEmptyView];
//4.隐藏emptyView
[self.tableView gt_hideEmptyView];
9-scrollView调用示例
普通View的调用与scrollView一致。因为scrollView没有DataSource,代码层面无法判断scrollView上是否有数据,所以如果scrollView想要实现占位图,还需要通过两种方法手动控制emptyView的显示和隐藏。以下是调用示例
//1.先设置样式
self.scrollView.gt_emptyView = [MyDIYEmpty diyNoDataEmpty];
//2.显示emptyView
[self.scrollView gt_showEmptyView];
//3.隐藏emptyView
[self.scrollView gt_hideEmptyView];
作者
liuxc123, [email protected]
许可证
GTEmptyView遵循MIT许可证。有关更多信息,请参阅LICENSE文件。