总体来说,分2个步骤:
一,从上到下寻找合适的控件来处理这个触摸事件。如下图,如果点击了黄色4,则UIApplication -> UIWindow -> 1白色 -> 2橙色 -> 3蓝色 -> 4黄色。
二,找到4黄色后,再从下到上遍历响应者链条:4黄色 -> 3蓝色 -> 2橙色 -> 1白色 -> UIWindow -> UIApplication
1)如果4黄色实现了touches...这些函数(具体下面第二条)且没有调用 super...则事件不再向上传递;如果调用了super...方法则事件会继续向上传递。
2)如果4黄色没有实现touches...这些函数,则直接向上传递。
详细介绍:
1 什么是响应者对象
在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之为“响应者对象”
2 触摸事件常用处理方法
提示:touches中存放的都是UITouch对象
3 UITouch对象
当用户用一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象,一个手指对应一个UITouch对象。如果有两个手指则会有UITouch对象,因此可以根据(NSSet *)touches的个数来判断有几个手指。
作用:
4 UIView不接收触摸事件的三种情况
提示:UIImageView的userInteractionEnabled默认是NO,因此它和它的子控件默认不能接收触摸事件。
5 寻找合适的响应者
从上到下寻找合适的控件,比如UIApplication -> UIWindow ->父控件子控件这样一级一级的找下去。
寻找顺序,或原则
调用的两个函数:- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
总结:很明显,如果父控件不能接收,则不再找子控件。
6 响应者链条
从下到上寻找合适的控件来处理这个事件,如果实现了touches。。。函数且没有调用super方法则事件不再向上传,如果没有实现touches或者在touches里面调用了super方法则事件继续向上传。(super不是指的父类,而是上一个响应者)
提示:如果当前的view是控制器的view,那控制器就是上一级响应者,否则上一级响应者为父控件。
7 自己实现touches...
如果没有调用super...,则系统不会做默认的处理,比如实现了UIButton的touchBegan方法则系统不会执行button的敲击事件(不发送消息)。