最近开始学习Swift, 发现了一个不错的视频学习网站,最近学习了方一雄大师的下拉刷新的教程,在此做以总结。附上视频学习的链接,「iOS提高班」如何制作带动画的下拉刷新
【总结几点实现刷新的重要步骤】
-
滚动进度跟踪
监听UIScrollView的代理方法,获取当前滚动的进度,滚动的进度体现在对UIScrollView的contentOffset.y的改变,而RefreshView的可见区域,是|contentOffset.y| 与contentInset.top的差let refreshViewVisibleHeight = max(0, -scrollView.contentOffset.y - scrollView.contentInset.top) progress = min(1.0, refreshViewVisibleHeight/kRefreshWindowHeight)
这里使用 max 和 min 方法来处理边界值情况
-
时差滚动
我们需要在下拉的过程中增加一些动画,来提升用户体验。这里的核心就是确定动画的起始和结束位置,我们可以通过移动速率来确定起始位置,基本原理就是 s = vt*,至于v的具体值,需根据需求来定。init(view: UIView, centerEnd: CGPoint, parallaxRatio: CGFloat, sceneHeight: CGFloat) { self.itemView = view self.centerEnd = centerEnd self.centerStart = CGPoint(x:centerEnd.x, y:centerEnd.y + sceneHeight * parallaxRatio) self.itemView.center = centerStart }
parallaxRatio 是速率
sceneHeight 是刷新视图的高度
根据之前刷新获取的progress 来处理item的移动
func updateItemViewWithProgress(progress: CGFloat) {
self.itemView.center = CGPoint(
x: self.centerStart.x,
y: self.centerStart.y - (self.centerStart.y - self.centerEnd.y) * progress
)
}
-
监听下拉停止,开始网络请求刷新
func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { if !isRefreshing && progress == 1 { beginRefreshing() targetContentOffset.memory.y = -scrollView.contentInset.top delegate?.refreshViewDidRefresh(self) } }
这里没理解为什么设置targetContentOffset.memory.y的值,我将该句注释后还可以正常工作