繼上篇《深入UIScrollView系列一(滑動屬性)》后凌那,
該篇主要講UIScrollView的滑動事件過程兼雄。
(關(guān)于iOS事件的流程,請參考我的另外一篇《iOS事件帽蝶,原來如此》)
UIScrollView touch事件原理:
在滾動過程當中赦肋,其實是在修改原點坐標。當手指觸摸后, UIScrollView 重寫了hitTest方法励稳,會暫時攔截觸摸事件佃乘,使用一個計時器。
從你的手指touch屏幕開始驹尼,UIScrollView開始一個timer趣避,如果:
- 150ms內(nèi)手指沒有任何滑動,UIScrollView發(fā)送 tracking events給被點擊的subView扶欣。
- 150ms內(nèi)手指有明顯的滑動鹅巍,UIScrollView就會滾動,消息不會傳給subView料祠。
- 150ms內(nèi)手指沒有滑動骆捧,scrollView將消息傳給subView,但是之后手指開始滑動髓绽,scrollView傳送touchesCancelled消息給subView敛苇,然后開始滾動。
觀察下tableView的情況:你先按住一個cell顺呕,150ms后cell開始高亮枫攀,手開始滑動,tableView開始滾動株茶,高亮取消来涨。
UIScrollView touch回彈機制:
我們發(fā)現(xiàn),當將圖片拖到邊緣的時候启盛,圖片還是可以繼續(xù)被拖動的蹦掐,會顯示contenSize之外的內(nèi)容,當你松開手的時候僵闯,就會彈回去卧抗。相關(guān)的屬性為:bounces,alwaysBounceHorizontal鳖粟,alwaysBounceVertical社裆。
bounces
:描述的當scrollview的顯示超過內(nèi)容區(qū)域的邊緣以及返回時,是否有彈性向图,默認值為YES泳秀。值為YES的時候标沪,意味著到達contentSize所描繪的的邊界的時候,拖動會產(chǎn)生彈性嗜傅。值為No的時候谨娜,拖動到達邊界時,會立即停止磺陡。所以,如果在上面的例子當中漠畜,將bounces設(shè)置為NO時币他,窗口中是不會顯示contentSize范圍外的內(nèi)容的。
alwaysBounceHorizontal
:默認值為NO憔狞,如果該值設(shè)為YES蝴悉,并且bounces也設(shè)置為YES,那么瘾敢,即使設(shè)置的contentSize比scrollView的size小拍冠,那么也是可以拖動的。
alwaysBounceVertical
:默認值為NO簇抵,如果該值設(shè)為YES庆杜,并且bounces也設(shè)置為YES,那么碟摆,即使設(shè)置的contentSize比scrollView的size小晃财,那么也是可以拖動的。
UIScrollView touch的縮放:
上一節(jié)我們看到了zooming屬性典蜕,scrollView除了支持拖動之外断盛,還支持縮放。
maximumZoomScale
: 最大放大比例愉舔,默認值為1钢猛,不得小于minimumZoomScale
minimumZoomScale
: 最小放大比例,默認值為1轩缤,不得大于maxmumZoomScale
bouncesZoom
: 描述在縮放超過縮放比例時命迈,是否bounce,默認值為YES典奉。如果值為NO躺翻,則達到最大或最小縮放比例時會立即停止縮放。否則卫玖,產(chǎn)生彈簧效果公你。
zoomScale
: 當前的縮放比例。系統(tǒng)會根據(jù)縮放過程調(diào)整此值假瞬。
setZoomScale:animated:
: 程序設(shè)置縮放大小陕靠。
zoomToRect:animated:
: 將內(nèi)容視圖縮放到指定的Rect中迂尝。
panGestureRecognizer
pinchGestureRecognizer
彩蛋:
利用UIScrollView的縮放特性,我們可以用來實現(xiàn)查看大圖(UIScrollView)剪芥,圖片的輪播(CollectionView)等功能垄开。自帶彈簧效果!
此文到此結(jié)束税肪!
請后續(xù)關(guān)注下文溉躲,[《深入UIScrollView系列三(滑動沖突)》]