iOS开发触摸事件的传递

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不能处理事件,则将其丢弃

原文地址:https://www.cnblogs.com/xiaofei993/p/5344995.html