1. iOS中的三种事件类型 触摸事件、加速计事件、远程事件。
触摸事件:通过触摸、手势进行触发(例如手指点击、缩放)
加速计事件:通过加速器进行触发(例如手机晃动,典型应用是微信摇一摇)
远程事件:通过其他远程设备触发(例如耳机控制按钮)
触摸事件的实现方法有四种,touchBegin/touchesMoved/touchesEnded/touchesCancelled
2. 触摸事件的传递
要想响应触摸事件必须得有一个前提,就是该对象必须是响应者对象,继承了UIResponder的对象就是响应者对象,只有响应者对象才能够接收并处理事件
(1)事件是怎么的产生和传递"
①.当手指触摸屏幕后会产生 '触摸事件', 然后将事件加入UIApplication的管理事件队列中
②.UIApplication会取出事件队列中 '最前面的事件' 分发下去,事先分发给应用程序的主窗口中 'keyWindow'
③.主窗口接收到事件后,分发给自己的子控件,寻找最适合的接收事件的控件
④.找到 '最适合' 接收的控件后,调用控件的touchesBegin/touchesMoved/touchesEnded方法
"2、如何找到最合适的控件来处理事件?"
①.判断自己是否能接收触摸事件?
/*
控件不接收触摸事件的三种情况
1> 不接收用户交互 userInteractionEnabled=NO
2> 隐藏 hidden = YES
3> 透明 alpha = 0.0 ~ 0.01
*/
②.判断触摸点是否在自己身上?
/*
* 判断触摸点在不在自己身上,view有一个方法【-(BOOL)pointInside:withEvent:】
* 返回NO,就代表不在自己身边上,那不再遍历子控件
* 返回YES,代表点在自己向上,那继续遍历子控件
*/
③.从后往前遍历子控件,重复前面的两个步骤
④.如果没有符合条件的子控件,那么就自己最适合处理的控件
⑤.找到最适合的控件后就调用touchesBegin/touchesMoved/touchesEnded方法
(2)响应者链条
"什么是响应者链条"
①.由多个响应者对象连接起来的链条叫做响应者链条
②.什么是上一个响应者?
>如果当前这个view是控制器的view,控制器就是上一个响应者
>如果当前这个view不是控制器的view,那么父控件就是上一个响应者
③.利用响应者链条可以让多个控件处理同一个 "触摸事件"
"怎么让多个控件处理同一个 ‘触摸事件’ 事件?"
>在最后适合的控件里调用super的touchesBegan方法,这样就将事件传给上一个响应,上一个响应者也可以处理事件了
"3、小结:事件的完整处理过程"
①.先将事件对象由上往下传递(由父控制传给子控件),找到最适合的控件来处理
②.调用最合适的控件的touches...方法
③.如果调用了[super touch…],就会将事件顺着响应都链往上传递,传递给上一个响应者
④.接着上一个响应者就会调用的touches...方法
⑤.如果没有找到最适合的控件来处理事件,则将事件传回来窗口,窗口不处理事件,将事件传给UIApplication
⑥.如果Applicatoin不能处理事件,则将其丢弃