关于iOS手势

时间:2022-09-02 15:56:56

引:

前几天遇到一个坑,又仔细分析了一下事件的原理,不得不承认苹果的文档还是写的挺好的,网上就搜不到有几篇博客是介绍这个的,都是一些关于基本的用法的。这里纪录一下。

1.关于事件响应链。

a.硬件接收到触摸事件,需要寻找到能够响应触摸的视图

(hitTest:withEvent:)大概打一个比方就像是一个好心人带着一个迷路的孩子(event),通过hitTest的方式帮助它寻找到它父母。至于寻找方式不再多说。

b.响应链

通过上述方式,找到了触摸的视图,称作touchView,同时也建立了一条视图响应链(就像去一个景点,去的路上可能要走几次岔路,反复折回最终才到达目的地,但是回去的时候,心中肯定就有一条明确的路线了,不会再走岔路),如果一个视图要把事件传递下去,下一个接棒的就是touchView.nextResponder。

找到触摸响应视图后,window创建一个UITouch对象,称作touchObj, 把touchObj.view = touchView.然后调用代理[touchView touchBegain/Moved/Cancel/Ended]; 你看,整个过程就是这样了。

2.关于手势

a.手势和响应链没有半毛钱关系

上面说到window把touchObj分发到touchView了,这是没有手势的情况,手势和事件响应链没有半毛钱关系,如果有手势的存在,touchView就变成后妈生的了,window会把touchObj先分发给手势对象,然后再分发给touchView.

b.手势几个重要属性解读

cancelsTouchesInView:默认YES.意思就是说一旦手势被识别,那么就调用[touchView touchesCancelled:withEvent]

delaysTouchesBegan:默认NO.意思就是再手势识别成功之前,touchObj还是要分发到touchView.设置为YES的时候就表示从手势识别成功之前touchObj不给touchView分发

delaysTouchesEnded:默认YES:在手势识别成功之前,touchesEnded不会被调用。设置为NO:在手势识别成功之前,touchesEnded会被调用。