iOS轮子: 下拉刷新,上拉加载更多
2016-11-15 17:28
881 查看
在iOS中下拉刷新和上拉加载更多组件(太长,下面就叫它pullToRefresh 组件了)使用的非常普遍。开源社区也有非常丰富的资源让你能够轻松的实现这个效果。观察各优秀app你会发现他们的pullToRefresh 组件都有自己的特色。如何才能快速的创建出私人定制版pullToRefresh 组件? 也许你能从我的开源项目HERefresh中获得一些灵感。
通过配置属性实现不同的行为:
1, canAutoLoadMore
2, befordDistance
3, isHiddenWhenNoMoreData
//不隐藏
HERefresh完成什么样的工作?
HERefresh是一个类簇。它维护着一个状态机,能过通过监听
UIScrollView的
contentOffset属性确定当前pullToRefresh组件应该切换到什么状态(说的简单,实现时考虑的东西还是挺多的)。然后根据具体状态对UI进行相应操作。
//状态 public enum HERefreshState: Equatable, CustomStringConvertible { case initial // 初始话 case pulling(progress: Float) // 下/上拉进度(0~1) case loading // 正在加载数据 case finished // 加载结束 case noMoreData // 没有更多数据(只在footer中有效) }
你需要做什么?
你要做的仅仅是创建一个继承自HERefreshView的类, 并根据状态修改UI或执行动画。
class HERefreshView: UIView,HERefreshDelegate { func refresh(_ refresh: HERefresh, stateChangedTo state: HERefreshState){ assert(false, "You must override \(#function)") } } protocol HERefreshDelegate:NSObjectProtocol { func refresh(_ refresh:HERefresh,stateChangedTo state:HERefreshState) }
实现效果
header-pullToMakeSoup
创意来自PullToRefresh。 我在demo中演示了如何使用HERefresh来实现这个效果。动画的实现原理参考这里。
header-default
咳咳,这个效果我是模仿的简书的。self.tableView.addDefaultHeader { //加载时进行回调, 模拟延时 let delayTime = DispatchTime.now() + Double(Int64(3 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) DispatchQueue.main.asyncAfter(deadline: delayTime) { self.data = 5 self.tableView.reloadData() self.tableView.endRefreshHeader() self.tableView.canLoadMoreData(true) } }
footer-default
folder-default完成上拉加载更多的功能。使用也是很简单,一句话:self.tableView.addDefaultFooter { //模拟延时 let delayTime = DispatchTime.now() + Double(Int64(3 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC) DispatchQueue.main.asyncAfter(deadline: delayTime) { self.data+=5 self.tableView.reloadData() self.tableView.endRefreshFooter() } }
通过配置属性实现不同的行为:
1, canAutoLoadMore
///自动加载更多。 ///false: 上拉一定距离,松手后才会进行加载 ///true: 当scrollView滑动到底部时就自动调用action块(默认值) var canAutoLoadMore = true
2, befordDistance
///当canAutoLoadMore = true时,在scrollView距离底部有一定距离时就开始提前加载。简书就有这样的效果。 var befordDistance:CGFloat = 0
3, isHiddenWhenNoMoreData
///没有更多数据时,是否隐藏refreshView。 var isHiddenWhenNoMoreData = false
//不隐藏
相关文章推荐
- android 下拉刷新上拉加载更多,高仿ios左滑动删除item,解决了众多手势问题
- android 仿qq5.3,下拉刷新,自动加载更多,下拉回弹,仿IOS橡皮筋效果,通用版,效果完美
- 非常简单的下拉刷新和下拉加载更多效果,仿IOS水滴,效果非常好,集成也很简单。
- iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库
- react native listview上拉加载更多下拉刷新兼容ios 安卓
- xamarin ios pullRefresh 下拉刷新,下拉加载更多
- IOS网络请求封装与下拉刷新上托加载更多
- iOS UITableView下拉刷新上拉加载更多MJRefresh类库(推荐)使用初级剑侠篇(欢迎提建议和分享遇到的问题)
- android 下拉刷新上拉加载更多,高仿ios左滑动删除item,解决了众多手势问题
- IOS-给UIScrollView(包括继承它的UITableView、UICollectionView)添加下拉刷新-上拉加载更多
- iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库
- iOS--UITableView上下拉刷新加载更多
- iOS开发 下拉刷新上拉加载更多详解
- iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库
- android 仿qq5.3,下拉刷新,自动加载更多,下拉回弹,仿IOS橡皮筋效果,通用版,效果完美
- IOS常用第三方框架 --- SVPullToRefresh 下拉刷新、上拉加载更多
- iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库
- iOS之MJRefresh下拉刷新和上啦加载更多实例
- iOS 下拉刷新和上拉加载更多
- iOS 下拉刷新和加载更多 (OC\Swift)