您的位置:首页 > 移动开发 > IOS开发

ios触摸事件二 :事件传递

2015-12-18 15:20 316 查看
了解了UIEvent以及UITouch之后,那么事件在iOS是如何传递的呢?

事件的传递:

从事件发生到其处理的对象,传递要经过特殊的一段过程。当用户点击设备屏幕时,IOS捕捉到一系列的触摸,将其打包到UIEvent对象中并放置到应用程序活动事件队列中。UIApplication对象从事件队列中取出最前面的事件并将其分发。通常,其发送事件给应用程序的主窗口——UIWindow实例,再由窗口对象发送给”第一响应者(触摸的视图)”处理。


响应者链:

响应者对象是一个能够接收并处理事件的对象。注意在IOS中不是任何对象都能处理事件,只有直接或间接继承了UIResponder的对象才可作为事件的响应者UIResponder是所有响应者对象的基类。在IOS的UI控件中,不是继承了UIView,就是继承了UIControl,实际上UIControl继承了UIView,UIView又继承了UIResponder.

/*UIControl ---> UIView ---> **UIResponder** --->NSObject*/


所以,实际上所有的UI控件都可以作为事件的响应者。即UIView、UIViewController等都可以作为响应者对象。

响应者链表示一系列的响应者对象。事件被交由第一响应者(触摸的那个view)对象,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一个响应者(next responder).

当用户与某个控件交互时,该空间将会作为”第一响应者(Firsr Responder)”,第一响应者将作为响应者链的开始,该事件首先被发送给第一响应者(即用户触摸屏幕的控件),事件将沿着响应者链一只向下传递,直到被某个响应者处理。

注意:若某个事件被某一个响应者处理,则该事件就会停止传递

����������������������响应者链的事件传递过程

通常来说,第一响应者都是UIView控件或UIView子类控件,当用户触摸该空间后,事件最先由该控件本身处理

如果该控件自身不处理事件,事件就会被传递到它对应的视图控制器

如果该视图控制器不存在或不处理事件,事件就会传递到包含该控件的父view

如果该父view仍不处理事件,事件就会传递到父view控件对应的视图控制器

父view控件的视图控制器不存在或不处理事件,那么事件被传递到父view控件的父view。。。。。

如果仍然不处理事件的话,事件会一直传递到UIWindow

如果UIWindow对象也不处理,事件则会传递到UIApplication的委托对象(即AppDelegate)

如果UIApplication也不能处理事件,那么不好意思,事件被丢弃。

呼呼。。传了这么久有点累了,上图:


另外注意UIView在以下情况下不接受触摸事件:

不接受用户交互:userInteractionEnable = NO; (eg:UILabel、UIImageView等控件,userInterractionEnable默认就是NO,因此这些控件默认是不能接受触摸事件的)

隐藏:hidden = YES;

透明:alpha = 0.0~0.01 之间,等价于隐藏了。。

所以如果想要一个view接受事件就必须打开用户交互、不隐藏、透明度大于0.01.

提示:以上均为个人见解,如有错误之处,望指正。谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: