iOS轮子: 下拉刷新,上拉加载更多
来源:互联网 发布:18rmmd动作数据 编辑:程序博客网 时间:2024/05/21 22:58
在iOS中下拉刷新和上拉加载更多组件(太长,下面就叫它pullToRefresh 组件了)使用的非常普遍。开源社区也有非常丰富的资源让你能够轻松的实现这个效果。观察各优秀app你会发现他们的pullToRefresh 组件都有自己的特色。如何才能快速的创建出私人定制版pullToRefresh 组件? 也许你能从我的开源项目HERefresh中获得一些灵感。
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
//不隐藏
0 0
- iOS轮子: 下拉刷新,上拉加载更多
- iOS 下拉刷新和上拉加载更多
- iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库
- iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库
- iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库
- listView 模仿ios的上拉刷新下拉加载更多
- iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库
- iOS下拉刷新上拉加载更多EGOTableViewPullRefresh类库
- iOS 下拉刷新和上拉加载更多
- iOS开发 下拉刷新上拉加载更多详解
- Listview 下拉刷新,上拉加载更多
- 下拉刷新以及上拉加载更多
- 下拉刷新和上拉加载更多
- android 上拉刷新,下拉加载更多
- Listview下拉刷新上拉加载更多
- 下拉刷新,上拉加载更多 PullToRefresh
- 下拉刷新,上拉加载更多ListView
- ListView下拉刷新,上拉加载更多
- 如何优化SQL语句
- Linux htop工具使用详解
- usaco ★Longest Prefix 最长前缀
- tensorflow学习笔记(二十):分布式注意事项
- Warning: The Copy Bundle Resources build phase contains this target's Info.plist file
- iOS轮子: 下拉刷新,上拉加载更多
- 【JZOJ4894】【NOIP2016提高A组集训第16场11.15】SJR的直线
- C#练习--库存管理
- 数据结构笔记之动态链表
- Activity嵌套Fragment,Fragment里用viewPager嵌套子Fragment报错解决方案
- cocos2d-js如何在android平台上使用js直接调用Java方法
- 收集了自定义 View 最优质的学习资料。
- Lua中os库详细介绍
- 小报告