先说几条结论:
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. 常见的例子,见下文的链接。
以上结论,纯属个人总结,如有不正确之处欢迎指正。