继上篇《深入UIScrollView系列一(滑动属性)》后,
该篇主要讲UIScrollView的滑动事件过程。
(关于iOS事件的流程,请参考我的另外一篇《iOS事件,原来如此》)
UIScrollView touch事件原理:
在滚动过程当中,其实是在修改原点坐标。当手指触摸后, UIScrollView 重写了hitTest方法,会暂时拦截触摸事件,使用一个计时器。
从你的手指touch屏幕开始,UIScrollView开始一个timer,如果:
- 150ms内手指没有任何滑动,UIScrollView发送 tracking events给被点击的subView。
- 150ms内手指有明显的滑动,UIScrollView就会滚动,消息不会传给subView。
- 150ms内手指没有滑动,scrollView将消息传给subView,但是之后手指开始滑动,scrollView传送touchesCancelled消息给subView,然后开始滚动。
观察下tableView的情况:你先按住一个cell,150ms后cell开始高亮,手开始滑动,tableView开始滚动,高亮取消。
UIScrollView touch回弹机制:
我们发现,当将图片拖到边缘的时候,图片还是可以继续被拖动的,会显示contenSize之外的内容,当你松开手的时候,就会弹回去。相关的属性为:bounces,alwaysBounceHorizontal,alwaysBounceVertical。
bounces
:描述的当scrollview的显示超过内容区域的边缘以及返回时,是否有弹性,默认值为YES。值为YES的时候,意味着到达contentSize所描绘的的边界的时候,拖动会产生弹性。值为No的时候,拖动到达边界时,会立即停止。所以,如果在上面的例子当中,将bounces设置为NO时,窗口中是不会显示contentSize范围外的内容的。
alwaysBounceHorizontal
:默认值为NO,如果该值设为YES,并且bounces也设置为YES,那么,即使设置的contentSize比scrollView的size小,那么也是可以拖动的。
alwaysBounceVertical
:默认值为NO,如果该值设为YES,并且bounces也设置为YES,那么,即使设置的contentSize比scrollView的size小,那么也是可以拖动的。
UIScrollView touch的缩放:
上一节我们看到了zooming属性,scrollView除了支持拖动之外,还支持缩放。
maximumZoomScale
: 最大放大比例,默认值为1,不得小于minimumZoomScale
minimumZoomScale
: 最小放大比例,默认值为1,不得大于maxmumZoomScale
bouncesZoom
: 描述在缩放超过缩放比例时,是否bounce,默认值为YES。如果值为NO,则达到最大或最小缩放比例时会立即停止缩放。否则,产生弹簧效果。
zoomScale
: 当前的缩放比例。系统会根据缩放过程调整此值。
setZoomScale:animated:
: 程序设置缩放大小。
zoomToRect:animated:
: 将内容视图缩放到指定的Rect中。
panGestureRecognizer
pinchGestureRecognizer
彩蛋:
利用UIScrollView的缩放特性,我们可以用来实现查看大图(UIScrollView),图片的轮播(CollectionView)等功能。自带弹簧效果!
此文到此结束!
请后续关注下文,[《深入UIScrollView系列三(滑动冲突)》]