通常,我們希望在滑動結(jié)束后擎鸠,執(zhí)行一些代碼雅宾。scrollViewDidEndDecelerating方法在一定程度上可以解決我們的需求预鬓。注意是一定程度上逼龟。
顧名思義,scrollViewDidEndDecelerating表示減速結(jié)束了。然而減速結(jié)束和滑動結(jié)束并不等價(jià)。因?yàn)橛行┗瑒硬⒉恍枰獪p速也可以結(jié)束彼哼。比如我兩只手輪流向左滑動,直到滑動到scrollview的右側(cè)盡頭為止湘今,這個(gè)過程的滑動是被迫終止而不是自然減速停止敢朱,所以scrollViewDidEndDecelerating方法是不會被執(zhí)行的。
怎么解決這個(gè)bug呢?可以用到另一個(gè)方法:scrollViewDidEndDragging: willDecelerate:
這個(gè)方法的含義是拖動結(jié)束拴签。也就是用戶的手從屏幕上抬起的一剎那孝常,會執(zhí)行這個(gè)方法。
那把之前scrollViewDidEndDecelerating方法里的代碼直接復(fù)制進(jìn)這個(gè)方法蚓哩,可以解決問題么茫因?答案是不可以。因?yàn)檫@個(gè)方法只能獲取到用戶的手離開屏幕事件杖剪,而這與滑動結(jié)束往往還有一段時(shí)間的間隔。如果原代碼涉及動畫相關(guān)驰贷,用戶體驗(yàn)將會非常糟糕盛嘿。此外,不難得出結(jié)論:
scrollViewDidEndDragging一定在scrollViewDidEndDecelerating方法之前被執(zhí)行括袒,有時(shí)候要早得多(自然停止滑動)次兆,有時(shí)候幾乎是同時(shí)的(被迫停止滑動)。
扯了這么多廢話锹锰,正確的解決方案是是什么呢芥炭?參加以下代碼:
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
if(!decelerate){
//這里復(fù)制scrollViewDidEndDecelerating里的代碼
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
}