http://www.jianshu.com/p/77a1b6e5194d
事件的产生和传递
在iOS中凡是继承自UIResponder的对象都能够接收并处理事件。
用户手指触摸屏幕一个view时候,系统会把该事件加入UIApplication管理的事件队列中去,这个队列是先进先出的,然后UIApplication会从事件队列中去除最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow),主窗口会在视图层次结构上面找到一个最合适的视图来处理触摸事件,这是整个事件处理的第一步,找到合适的视图控件之后,他就会调用试图的touches方法来处理事件
查找最合适处理事件的视图
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
这个方法就是用来查找最合适处理事件的方法,这个方法可以和- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;
配合使用,后面这个方法就是用来判断触摸点是否在其身上,返回一个BOOL值
我们可以重写- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
这个方法,自己来模仿父类是如何处理找到最合适的视图的。当然我们也可以调用父类的这个方法,这样重写就没什么作用了。
响应者链条
响应者链条就是由多个响应者对象连接起来的链条,它的作用就是让我们能够清楚的看见每个响应者之间的联系,并且可以让一个时间多个对象处理
响应者链条是怎么个样子呢,我们可以看下这两个图
补充:
找到合适的view是从UIApplication->Window向上查找的
touchbegan是从上向下传递的 view ....>window > UIapplication
如果重写了touchbegan则不向下继续传递, 如果需要传递需要调用super touchubegan方法