1.手动拖拽scrollView,并且没有加速度时(手指放开后就立即停止滑动)
可以看出:
- 先执行scrollViewWillBeginDragging:,将要开始拖拽
- 然后执行n个scrollViewDidScroll,只要是scrollView的contentOffset发生改变就会执行,无论是通过手动拖拽还是代码改变了contentOffset
- 接着执行scrollViewWillEndDragging:withVelocity:targetContentOffset:,即将结束拖拽,其中velocity为减速滑动前的初速度,而此时velocity为CGZero,说明不会减速滑动,手指停止拖拽时就会立即停止,targetContentOffset为最终停止时的位置
- 最后执行scrollViewDidEndDragging:willDecelerate:,拖拽结束,因为没有减速滑动,所以此时也是scrollView最终停止位置
2.手动拖拽scrollView,并且有加速度时(手指放开后,还会减速滑动一段距离)
可以看出:
- 和第一种无加速度的拖拽类似,都是先执行scrollViewWillBeginDragging:(将要开始托追),再跟随手指拖拽执行了一定次数的scrollViewDidScroll:,然后是即将停止拖拽scrollViewWillEndDragging:withVelocity:targetContentOffset:和停止拖拽scrollViewDidEndDragging:willDecelerate:
- 不同点在于,在执行scrollViewWillEndDragging:withVelocity:targetContentOffset:时,当前情况下的velocity不是CGZero,说明他有减速运动前的初速度,会进行一段减速滑动
- 紧接着拖拽结束,执行scrollViewWillBeginDecelerating:,即将减速滑动,然后伴随着减速滑动执行多次scrollViewDidScroll:,减速滑动停止时执行scrollViewDidEndDecelerating:,此时为当前情况下scrollView最终停止位置
3.代码控制scrollView滑动
- (void)buttonClick {
[self.scrollView setContentOffset:CGPointMake(500, 0)];
}
- 以上面的代码为例,点击button改变scrollView的contentOffset,且无动画效果;可以看出仅仅执行了一次scrollViewDidScroll:
- (void)buttonClick {
[self.scrollView setContentOffset:CGPointMake(500, 0) animated:YES];
}
- 由上图可以看出,同样用代码设置相同的contentOffset,animated为YES时,执行了多次scrollViewDidScroll:,并且在滚动动画结束时执行了scrollViewDidEndScrollingAnimation:
- 补充:在scrollView(及其子类)执行以下方法时,如果animate为YES,在动画结束时会调用scrollViewDidEndScrollingAnimation:
- UIScrollView的**setContentOffset:animated: **
- UIScrollView的**scrollRectToVisible:animated: **
- UITableView的scrollToRowAtIndexPath:atScrollPosition:animated:
- UITableView的selectRowAtIndexPath:animated:scrollPosition: