MRefresh 0.2.1

MRefresh 0.2.1

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布上次发布2021年1月
SPM支持 SPM

Mikhail Rakhmanov 维护。



MRefresh 0.2.1

  • Mikhail Rakhmanov

MRefresh

[![CI 状态](http://img.shields.io/travis/Mikhail Rakhmanov/MRefresh.svg?style=flat)](https://travis-ci.org/Mikhail Rakhmanov/MRefresh) Version License Platform

什么是 MRefresh

所以基本上,MRefresh 是一个具有明确关注点分离的拉动刷新功能,由几个独立的组件组成

  • 一个拉动刷新机制,它将一个容器视图添加到滚动视图中。此容器视图使用符合 AnimatableViewConforming 协议的可动画视图。观点在拉动刷新的每个阶段都会接收消息(请参阅下面的描述),
  • 一个路径绘制机制,它能够读取多个人图路径(这是一个人图的一部分 SVGConnectedPathFactory),将它们转换为 UIBezierPath 对象,向这些路径添加额外的点,以使绘制更加平滑(使用 De Castelaju 算法 - https://en.wikipedia.org/wiki/De_Casteljau's_algorithm)。

总结来说,您可以

  • 取一些SVG路径(尽管目前尚未实现arc命令,这需要使用三次曲线近似弧线,因此相对复杂),
  • 为下拉刷新视图提供您自己的自定义动画。

所以这里有一个这个库可以做什么的快速示例(我们正在绘制FontAwesome中的一个SVG路径)

Alt Text

示例

以下配置下拉刷新视图所需的步骤。当然,如果您不想阅读详细信息,可以下载示例并在自己身上试一下。

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 文件。