最近開始學(xué)習(xí)Swift, 發(fā)現(xiàn)了一個(gè)不錯(cuò)的視頻學(xué)習(xí)網(wǎng)站,最近學(xué)習(xí)了方一雄大師的下拉刷新的教程,在此做以總結(jié)。附上視頻學(xué)習(xí)的鏈接,「iOS提高班」如何制作帶動(dòng)畫的下拉刷新
【總結(jié)幾點(diǎn)實(shí)現(xiàn)刷新的重要步驟】
-
滾動(dòng)進(jìn)度跟蹤
監(jiān)聽UIScrollView的代理方法,獲取當(dāng)前滾動(dòng)的進(jìn)度,滾動(dòng)的進(jìn)度體現(xiàn)在對(duì)UIScrollView的contentOffset.y的改變,而RefreshView的可見區(qū)域,是|contentOffset.y| 與contentInset.top的差let refreshViewVisibleHeight = max(0, -scrollView.contentOffset.y - scrollView.contentInset.top) progress = min(1.0, refreshViewVisibleHeight/kRefreshWindowHeight)
這里使用 max 和 min 方法來處理邊界值情況
-
時(shí)差滾動(dòng)
我們需要在下拉的過程中增加一些動(dòng)畫,來提升用戶體驗(yàn)。這里的核心就是確定動(dòng)畫的起始和結(jié)束位置,我們可以通過移動(dòng)速率來確定起始位置,基本原理就是 s = vt*,至于v的具體值,需根據(jù)需求來定。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 是刷新視圖的高度
根據(jù)之前刷新獲取的progress 來處理item的移動(dòng)
func updateItemViewWithProgress(progress: CGFloat) {
self.itemView.center = CGPoint(
x: self.centerStart.x,
y: self.centerStart.y - (self.centerStart.y - self.centerEnd.y) * progress
)
}
-
監(jiān)聽下拉停止,開始網(wǎng)絡(luò)請(qǐng)求刷新
func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { if !isRefreshing && progress == 1 { beginRefreshing() targetContentOffset.memory.y = -scrollView.contentInset.top delegate?.refreshViewDidRefresh(self) } }
這里沒理解為什么設(shè)置targetContentOffset.memory.y的值,我將該句注釋后還可以正常工作