学习使用Swift实现pullToRefresh

最近开始学习Swift, 发现了一个不错的视频学习网站,最近学习了方一雄大师的下拉刷新的教程,在此做以总结。附上视频学习的链接,「iOS提高班」如何制作带动画的下拉刷新

【总结几点实现刷新的重要步骤】

  1. 滚动进度跟踪
    监听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 方法来处理边界值情况

  1. 时差滚动
    我们需要在下拉的过程中增加一些动画,来提升用户体验。这里的核心就是确定动画的起始和结束位置,我们可以通过移动速率来确定起始位置,基本原理就是 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
      )
    }
  1. 监听下拉停止,开始网络请求刷新

     func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) {
        if !isRefreshing && progress == 1 {
         beginRefreshing()
         targetContentOffset.memory.y = -scrollView.contentInset.top
         delegate?.refreshViewDidRefresh(self)
         }
     }
    

这里没理解为什么设置targetContentOffset.memory.y的值,我将该句注释后还可以正常工作

你可能感兴趣的:(学习使用Swift实现pullToRefresh)