参考文章:http://blog.csdn.net/likendsl/article/details/7592867
scroll view 原理
关于事件处理的认识:
首先了解下UIScrollView对于touch事件的接收处理原理:UIScrollView应该是重载了hitTest 方法,并总会返回itself 。所以所有的touch 事件都会进入到它自己里面去了。内部的touch事件检测到这个事件是不是和自己相关的,或者处理或者除递给内部的view。
为了检测touch是处理还是传递,UIScrollView当touch发生时会生成一个timer。
(1)如果150ms内touch未产生移动,它就把这个事件传递给内部view;
(2)如果150ms内touch产生移动,开始scrolling,不会传递给内部的view。(如当你touch一个table时候,直接scrolling,你touch的那行永远不会highlight。)
(3)如果150ms内touch未产生移动并且UIScrollView开始传递内部的view事件,但是移动足够远的话,且canCancelContentTouches = YES,UIScrollView会调用touchesCancelled方法,cancel掉内部view的事件响应,并开始scrolling。(如当你touch一个table, 停止了一会,然后开始scrolling,那一行就首先被highlight,但是随后就不在高亮了)
在滚动过程当中,其实是在修改原点坐标,也就是修改UIScrollView的bounds的x和y的值(默认是0也就是原点),当改变了bounds的值,那么UIScrollView内部的控件的的位置要发生改变(原点位置发生了改变),也就产生所谓的滚动效果(UIScrollView的滚动条其实是其内部的一个UIImageview控件)。当手指触摸后, scroll view会暂时拦截触摸事件,使用一个计时器。假如在计时器到点后没有发生手指移动事件,那么 scroll view 发送 tracking events 到被点击的 subview。假如在计时器到点前发生了移动事件,那么 scroll view 取消 tracking 自己发生滚动。