很久以前接到过一个需求,类似淘宝详情页,当商品左滑到尽头后需要做一些特定展示。
基本和下拉刷新相似,不过是从左向右拉刷新。
正好有时间,所以干脆写一个上下左右都能拉刷新也挺好的,于是参考 MJRefresh,用 OC 版本实现了一个。
随着 Swift 的不断进步,我也顺势完成了 Swift 版本,经过多次迭代,感觉趋于完善,并且 Swift
-
支持上下左右四个方向的刷新,且可旋转
-
可配置触发刷新阈值、悬停等各种参数
-
支持自定义 view 的协议化
要求
- iOS 8.0+
- Swift 5.0+
安装
pod 'YYRefreshView'
使用
最简单的使用
使用默认配置,默认的刷新 view:
scrollView.addYYRefresh(position: .top) { refresh in
xxx
}
自定义配置
默认配置如下:
var config = YYRefresh.Config.default
/// 不同状态显示文案,默认是top位置的
config.textIdle = "下拉可以刷新"
config.textReady = "松开立即刷新"
config.textRefreshing = "正在刷新..."
config.textNoMore = "没有更多数据了..."
/// 刷新控件高度,自定义view的时候可以按需设置
config.viewHeight = 50
/// 触发刷新需要滚动的阈值
config.readyOffset = 50
/// right和bottom位置是否需要当contentSize不足一屏的时候自动隐藏
config.visableCheckAutomatic = false
/// 触发刷新阈值后,是否悬停等待
config.parkVisible = true
/// 悬停状态出现或消失的动画时间
config.animateDurationParking = 0.25
/// 不同状态切换时的动画时间
config.animateDurationStateSwitching = 0.4
/// 使用config
scrollView.addYYRefresh(position: .top, config: config) { refresh in
xxx
}
自定义显示的view
如果需要使用自定义的view,只需使用实现YYRefreshView协议的控件即可:
/// 自定义RefreshView必须实现的协议
public protocol YYRefreshView: class {
/// 真正的view
var view: UIView { get }
/// 不同状态时的显示
func show(_ state: YYRefresh.State, config: YYRefresh.Config, animated: Bool)
}
定义一个自己的view
class TopRefreshDemoView: UIView {}
extension TopRefreshDemoView: YYRefreshView {
var view: UIView { self }
func show(_ state: YYRefresh.State, config: YYRefresh.Config, animated: Bool) {
}
}
使用:
scrollView.addYYRefresh(position: .top,
config: config,
refreshView: TopRefreshDemoView()) { refresh in
xxx
}
一些实现说明
上下方向的刷新控件很常见,主要参考了MJRefresh,
这里简单说下左右方向的实现方式:
- 在左右方向添加刷新控件时,采用的方式是,将refreshView顺时针旋转90度
- 因此需要将view的anchorPoint调整到{0, 0},同时保持frame不变,使用了下面的扩展
private extension UIView {
/// 设置view的anchorPoint,同时保证view的frame不改变
func _setAnchorPointFixedFrame(_ anchorPoint: CGPoint) {
let oldOrigin = frame.origin
layer.anchorPoint = anchorPoint
let newOrign = frame.origin
let transition = CGPoint(x: newOrign.x - oldOrigin.x, y: newOrign.y - oldOrigin.y)
center = CGPoint(x: center.x - transition.x, y: center.y - transition.y)
}
}
许可
YYRefresh遵守MIT许可。请参阅LICENSE文件获取更多信息。