1.事件的传递和响应的区别
-事件的传递是从上到下(父控件到子控件),事件的响应是从下到上(顺着响应者链条向上传递:子控件到父控件。
2.事件的传递
-查看UIEventType,我们可以知道 有下面四类事件
UIEventTypeTouches: 触摸事件
UIEventTypeMotion: 运动事件,类似 微信摇一摇事件
UIEventTypeRemoteControl: 远程控制事件,比如播放/暂停 音乐等
UIEventTypePresses: 物理按钮事件 (按压事件指对一个游戏控制器、苹果TV远程,或其他有物理按钮的设备之间的交互,所以对于iPhone的手机而言在没有物理按键连接的情况下,是无法触发该事件的)
-触摸事件的传递是从父控件传递到子控件;触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中,传递的过程也就是UIApplication->window->寻找处理事件最合适的view
3.事件的响应
先上图:
能响应事件的都是UIResponder及其子类,常见的UIResponder的子类有:UIView、UIViewController、UIApplication和UIApplicationDelegate
-1 控件的下一个响应者是它的父视图view;如果view是控制器的view,那么控制器就是下一个响应者,事件就传递给控制器;如果当前view不是控制器的view,那么父视图就是当前view的下一个响应者,事件就传递给它的父视图
-2 在视图层次结构的最顶级视图,如果也不能处理收到的事件,则其将事件传递给window对象进行处理
-3 如果window对象也不处理,则其将事件或消息传递给UIApplication对象
-4 如果UIApplication和UIApplicationDelegate都不能处理该事件,该事件就会被忽略
参考:
1. Using Responders and the Responder Chain to Handle Events