1、事件的产生及传递
发生触摸事件后,系统会将事件加入到一个由UIApplication管理的事件队列中,
UIApplication会从事件队列中取出最前面的事件,并将事件发放下去以便处理,通常先发送给应用程序的主窗口
主窗口会在视图层次结构中选出最合适的试图控件,来处理事件,这也是整个过程的第一步
找到合适的视图控件后,就会调用最合适的视图控件的touches方法来处理事件,
2、如何寻找最合适的视图控件?
自己能否接受触摸事件
触摸点是否在自己身上
从后往前遍历所有子控件,重复前两步
如果没有最合适的view,那么就自己最适合处理
3、事件的响应
找到最合适的view后调用touches方法,系统的默认做法是沿着响应者链条向上传递
3.1响应者链条
由多个响应者连接而成的链条
能清楚的观察到每个响应者之间的关系,并且可以使一个事件可以被多个对象处理
3.2响应者
继承自UIResponder的对象
具备处理事件的能力
3.3如何寻找上一个响应者
当前的view是控制器的view,那么上一个响应者就是控制器
当前的view不是控制器的view,那么上一个响应者就是父控件
找到上一个响应者,继续调用上一个响应者的touches方法,以此类推
4.事件传递的完整过程
先将事件对象从上往下进行传递,(即父控件传递给子控件)找到最合适的视图控件来处理事件
调用最合适的视图控件的touches方法处理事件
如果调用了[super touches….];就会将事件顺着响应者链条往上传递,传递给上一个响应者
接着就会调用上一个响应者的touches….方法
5.响应者链条的事件传递过程
如果view的控制器存在,就传递给控制器,如果view的控制器不存在,就传递给父控件
在视图层次的最顶端如果也不能处理事件或消息,那么就将该事件传递给UIWindow对象
如果UIWindow对象也不能处理事件或消息,那么就将事件传递给UIApplication
如果UIApplication对象也不能处理事件或消息,那么就将事件丢弃
6.不能接收事件的五种方式
userInteractionEnabled == NO
hidden == YES
alpha <= 0.01
父控件不能接收事件
子控件超出父控件的尺寸
网友评论