手势和响应链

先说几条结论:

1. 系统首先根据hit-test方法,找出最佳响应者,建立响应链。

2. UIResponder 默认响应是会将事件传给nextResponder,如果有响应者处理了这个事件,那么就会阻断事件的继续传递。

3.如果一个View被触摸, 先去从最佳响应者开始去遍历响应链,

3.1 如果响应链上发现有手势可以响应:

a 如果最佳响应者是UIControl本身和子类,

      a1 该手势不是在UIControl身上,

           则执行UIControl的sendTarget:withAction:方法,否则执行手势,且该手势独占触摸事件,并且调用touch:Cancel方法取消向响应链的传播。

      a2 该手势是在UIControl身上,则执行该手势。不执行sendTarget:withAction:方法。

b 如果最佳响应者不是UIControl本身和子类,

        b1 执行手势,且该手势独占触摸事件,并且调用touch:Cancel方法取消向响应链的传播。

3.2 如果响应链上发现没有手势可以响应:则执行touch相关的事情和sendTarget:withAction:等方法,一旦有相关的方法被执行,则不会去调用super touch等方法,取消事件向上传递。否则让下一个响应者进行处理。

4. 其中UIControl和UIScrollView比较特殊。

UIControl 默认能够响应事件,会阻断事件沿着响应链传递。

UIScrollView 默认添加了pan 和 pinch手势,UItableViewCell能够响应点击是调用了touchBegin等方法中实现的。

5.另外可以设置手势的相关属性,控制View是否执行touch:Cancel方法,保证2者都生效。

6. 常见的例子,见下文的链接。

以上结论,纯属个人总结,如有不正确之处欢迎指正。

事件传递和响应链

你可能感兴趣的:(手势和响应链)