MRefresh
[](https://travis-ci.org/Mikhail Rakhmanov/MRefresh)
什么是 MRefresh
所以基本上,MRefresh 是一个具有明确关注点分离的拉动刷新功能,由几个独立的组件组成
- 一个拉动刷新机制,它将一个容器视图添加到滚动视图中。此容器视图使用符合 AnimatableViewConforming 协议的可动画视图。观点在拉动刷新的每个阶段都会接收消息(请参阅下面的描述),
- 一个路径绘制机制,它能够读取多个人图路径(这是一个人图的一部分 SVGConnectedPathFactory),将它们转换为 UIBezierPath 对象,向这些路径添加额外的点,以使绘制更加平滑(使用 De Castelaju 算法 - https://en.wikipedia.org/wiki/De_Casteljau's_algorithm)。
总结来说,您可以
- 取一些SVG路径(尽管目前尚未实现arc命令,这需要使用三次曲线近似弧线,因此相对复杂),
- 为下拉刷新视图提供您自己的自定义动画。
所以这里有一个这个库可以做什么的快速示例(我们正在绘制FontAwesome中的一个SVG路径)
示例
以下配置下拉刷新视图所需的步骤。当然,如果您不想阅读详细信息,可以下载示例并在自己身上试一下。
SVGConnectedPathFactory
该库的设计允许您配置下拉刷新过程中的所有参数。
首先,你需要SVG路径,例如(这个路径是从FontAwesome图标中获取的,希望没有侵犯版权)
let path = "M1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23"
其次,您需要创建SVG路径配置,这提供了关于路径如何缩放的附加参数。
var configuration = SVGConnectedPathConfiguration(size: size)
在这里,您提供放置路径的大小(基本算法尝试将路径居中,以便路径尽可能占满空间)。
configuration.add(svg: path, startProportion: 0.0, depth: 2)
在这里,您将svg路径的一部分添加到配置中。
startProportion决定了在拉取刷新过程中此路径应该在何时开始绘制。这在您有多个路径部分需要同时或延迟开始绘制时很有用。
depth表示您希望路径平滑的程度(即希望生成的新点的数量=初始SvgPoints * 2 ^ 3)。
然后,通过SVGConnectedPathFactory创建SVGNode,它将处理将您的svg转换为不同大小的所有繁重工作。
let nodes = try SVGConnectedPathFactory.default.make(pathConfiguration: configuration)
PathDrawingAnimatableView
创建路径管理器后,创建可动画视图的时间就到了。你可以这样做
let frame = CGRect(origin: CGPoint.zero,
size: size)
let animatableView = PathDrawingAnimatableView(path: connectedPath, frame: frame)
所以,frame显然是视图被绘制到的帧(实际上这里的原点不重要,因为它在底层被计算)。
向滚视图添加处理程序
最后一步是将可动画视图、配置和动作处理程序(即当内容偏移量达到特定值时被调用的闭包)添加到滚视图。
tableView.addPullToRefresh(animatable: animatableView, handler: { [weak self] in
self?.somePresenter.didAskToRefreshAView()
})
...
// when the data was loaded
tableView.stopAnimating()
PullToRefreshConfiguration
在将视图添加到滚视图作为下拉刷新时,可以指定额外的参数,请参阅 PullToRefreshConfiguration。
Pull-to-refresh mechanism
以下是对下拉刷新机制的简要描述。首先,有一个对UIScrollView的扩展,允许您添加一个符合特定协议 AnimatableViewConforming 的视图。当用户拉动并释放它时,该视图将接收到UIScrollView发送的某些消息。
我们可以将下拉刷新视为一个4阶段过程。
第一阶段
当可动画视图变得可见时,scrollview的内容偏移量尚未达到某些起始值(startValue)。
第二阶段
scrollview的内容偏移量达到了起始值,并且AnimatableContainerView(内部使用的容器视图)通知您的视图调用drawPullToRefresh(proportion: CGFloat)。比例将是一个从0到1的CGFloat值,这取决于内容偏移量是否达到了某个其他值,我们称之为结束值(endValue)。
如果存在库中提供的遵守 AnimatableViewConforming 协议的 PathDrawingAnimatableView 视图,则比例值将告诉您的视图在屏幕上应显示路径中的多少点。
第三阶段
当 scrollview 的内容偏移量达到 endValue 时,
- 视图将接收 startAnimation 消息,
- scrollview 的内边距增加以适应可动画视图以及一些额外的空间(即 AnimatableContainerView 的边框),
- 调用 actionHandler 闭包(例如,某些服务应开始下载某些内容等)。
第四阶段
scrollview 收到 stopAnimating 消息(您应在数据/错误接收加载时发送消息)。之后,如果没有用户用手指握住视图,则视图将接收到 stopAnimation 消息。
请注意相应的时机,因为用户放开手指后,scrollview 将将其内边距更改回初始值。
安装
MRefresh 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod 'MRefresh', '~> 0.2.1'
作者
米哈伊尔·拉赫马诺夫,[email protected]
许可证
MRefresh 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。