美文网首页架构师之路iOS Developer程序员
深入UIScrollView系列二(滑动缩放回弹)

深入UIScrollView系列二(滑动缩放回弹)

作者: muice | 来源:发表于2016-12-17 12:51 被阅读340次

继上篇《深入UIScrollView系列一(滑动属性)》后,
该篇主要讲UIScrollView的滑动事件过程。
(关于iOS事件的流程,请参考我的另外一篇《iOS事件,原来如此》

UIScrollView touch事件原理:
在滚动过程当中,其实是在修改原点坐标。当手指触摸后, UIScrollView 重写了hitTest方法,会暂时拦截触摸事件,使用一个计时器。

从你的手指touch屏幕开始,UIScrollView开始一个timer,如果:

  1. 150ms内手指没有任何滑动,UIScrollView发送 tracking events给被点击的subView。
  2. 150ms内手指有明显的滑动,UIScrollView就会滚动,消息不会传给subView。
  3. 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系列三(滑动冲突)》]

参考:
iOS开发学习笔记-UIScrollView的用法
scroll view 原理

相关文章

网友评论

    本文标题:深入UIScrollView系列二(滑动缩放回弹)

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