这是MJRefresh的swift版本,先OC原版奉上MJRefresh,JRefresh为纯Swift版本,支持swift3.2以上,iOS8.0以上版本。代码逻辑和MJRefresh基本一模一样,本来一开始打算用swift的面向协议**改写的,发现行不通只好用原作者一模一样的继承**翻译成Swift。JRefresh剔除了原有的过期方法,也没有Selector调用方法(不想再混入OC文件,swift不支持objc_msgSend),只剩下闭包调用。
- 由于项目使用swift语言开发原来越多。但OC和swift混编要桥接文件,编译慢,无法达到纯正的swift第三方效果。(个人洁癖哈,使用pod还好,假如拖入项目的那一大堆.h.m文件实在难受)。可以让只会swift语言的孩子查看源代码哈(虽然这样的孩子不多~)
- 项目中一直在用MJRefresh,但没有翻译一遍来的理解透彻。
- 自己学习提高咯。后期可以丰富更多个性化功能~
支持swift3.2 以上, iOS版本8.0以上
- 使用cocoapods
pod 'JRefresh'
- 下载demo,直接将
JRefresh
文件夹拖到项目中使用
没错,比MJRefresh少了backFooter
,主要是一直没有用到过(一次都没啊~),所以暂时给取消了,假如反应的人多,下个版本就给加上
这些反正和MJRefresh一模一样(就是照着他翻译过来的哈)
- 默认下拉(只有刷新时间、状态)
tableView.header = JRefreshStateHeader.headerWithRefreshingBlock({[weak self] in
guard let `self` = self else {return}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: {
self.count += 2
self.tableView.reloadData()
self.tableView.header?.endRefreshing()
})
})
tableView.header?.beginRefreshing()
- 默认下拉带⭕️动画
tableView.header = JRefreshNormalHeader.headerWithRefreshingBlock({[weak self] in
guard let `self` = self else {return}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: {
self.count += 2
self.tableView.reloadData()
self.tableView.header?.endRefreshing()
})
})
(tableView.header as? JRefreshNormalHeader)?.arrowViewNeedCircle = true
tableView.header?.beginRefreshing()
- 下拉带菊花、箭头
tableView.header = JRefreshNormalHeader.headerWithRefreshingBlock({[weak self] in
guard let `self` = self else {return}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: {
self.count += 2
self.tableView.reloadData()
self.tableView.header?.endRefreshing()
})
})
tableView.header?.beginRefreshing()
- GIF 刷新
tableView.header = JChiBaoZiHeader.headerWithRefreshingBlock({[weak self] in
guard let `self` = self else {return}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: {
self.count += 2
self.tableView.reloadData()
self.tableView.header?.endRefreshing()
})
})
tableView.header?.beginRefreshing()
- 下拉刷新 自定义文字
let header = JRefreshNormalHeader.headerWithRefreshingBlock({[weak self] in
guard let `self` = self else {return}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: {
self.count += 2
self.tableView.reloadData()
self.tableView.header?.endRefreshing()
})
})
// 设置文字
(header as! JRefreshNormalHeader).setTitle("lee", .Idle)
(header as! JRefreshNormalHeader).setTitle("jiang", .Pulling)
(header as! JRefreshNormalHeader).setTitle("bo", .Refreshing)
// 设置字体
(header as! JRefreshNormalHeader).stateLabel.font = UIFont.systemFont(ofSize: 16)
(header as! JRefreshNormalHeader).lastUpdatedTimeLabel.font = UIFont.systemFont(ofSize: 14)
// 设置颜色
(header as! JRefreshNormalHeader).stateLabel.textColor = UIColor.red
(header as! JRefreshNormalHeader).lastUpdatedTimeLabel.textColor = UIColor.blue
header.beginRefreshing()
tableView.header = header
- 上拉带loading
tableView.footer = JRefreshAutoNormalFooter.footerWithRefreshingBlock({[weak self] in
guard let `self` = self else {return}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: {
self.count += 2
self.tableView.reloadData()
self.tableView.footer?.endRefreshing()
})
})
- 上拉Gif(无文字状态)
tableView.footer = JChiBaoZiFooter.footerWithRefreshingBlock({[weak self] in
guard let `self` = self else {return}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: {
self.count += 5
self.tableView.reloadData()
self.tableView.footer?.endRefreshing()
if self.count >= 40 {
self.tableView.footer?.endRefreshingWithNoMoreData()
}
})
})
(tableView.footer as? JRefreshAutoGifFooter)?.refreshingTitleHidden = true
- 自定义上拉视图
tableView.footer = JDIYAutoFooter.footerWithRefreshingBlock({[weak self] in
guard let `self` = self else {return}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3, execute: {
self.count += 5
self.tableView.reloadData()
self.tableView.footer?.endRefreshing()
if self.count >= 40 {
self.tableView.footer?.endRefreshingWithNoMoreData()
}
})
})