UIScrollView代理执行顺序

作者: BrightFuture | 来源:发表于2016-09-10 14:37 被阅读0次
1.手动拖拽scrollView,并且没有加速度时(手指放开后就立即停止滑动)
没有加速度时的控制台打印信息

可以看出:

  • 先执行scrollViewWillBeginDragging:,将要开始拖拽
  • 然后执行n个scrollViewDidScroll,只要是scrollView的contentOffset发生改变就会执行,无论是通过手动拖拽还是代码改变了contentOffset
  • 接着执行scrollViewWillEndDragging:withVelocity:targetContentOffset:,即将结束拖拽,其中velocity为减速滑动前的初速度,而此时velocity为CGZero,说明不会减速滑动,手指停止拖拽时就会立即停止,targetContentOffset为最终停止时的位置
  • 最后执行scrollViewDidEndDragging:willDecelerate:,拖拽结束,因为没有减速滑动,所以此时也是scrollView最终停止位置
2.手动拖拽scrollView,并且有加速度时(手指放开后,还会减速滑动一段距离)
有加速度时控制打印的信息01
有加速度时控制打印的信息02

可以看出:

  • 和第一种无加速度的拖拽类似,都是先执行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)];
}
代码改变scrollView的contentOffset且无动画时的控制台打印
  • 以上面的代码为例,点击button改变scrollView的contentOffset,且无动画效果;可以看出仅仅执行了一次scrollViewDidScroll:
 - (void)buttonClick { 
    [self.scrollView setContentOffset:CGPointMake(500, 0) animated:YES];
  }
代码改变scrollView的contentOffset且有动画时的控制台打印
  • 由上图可以看出,同样用代码设置相同的contentOffset,animated为YES时,执行了多次scrollViewDidScroll:,并且在滚动动画结束时执行了scrollViewDidEndScrollingAnimation:
  • 补充:在scrollView(及其子类)执行以下方法时,如果animate为YES,在动画结束时会调用scrollViewDidEndScrollingAnimation:
    • UIScrollView的**setContentOffset:animated: **
    • UIScrollView的**scrollRectToVisible:animated: **
    • UITableView的scrollToRowAtIndexPath:atScrollPosition:animated:
    • UITableView的selectRowAtIndexPath:animated:scrollPosition:

相关文章

网友评论

    本文标题:UIScrollView代理执行顺序

    本文链接:https://www.haomeiwen.com/subject/ecvyettx.html