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.
所以,实际上所有的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.
提示:以上均为个人见解,如有错误之处,望指正。谢谢
事件的传递:
从事件发生到其处理的对象,传递要经过特殊的一段过程。当用户点击设备屏幕时,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.
提示:以上均为个人见解,如有错误之处,望指正。谢谢
相关文章推荐
- iOS中assign、copy 、retain等关键字的含义
- iOS中常用的数据类型转换
- IOS pod使用笔记
- IOS pod使用笔记
- IOS pod使用笔记
- 选择手机图片上传&PHIMageManager
- iOS使用AVFoundation实现二维码扫描
- iOS 导出证书.p12文件
- iOSpush到某个页面然后跳转导航栏指定页面
- iOS 开发、测试、生产的描述文件(配置文件)
- IOS学习笔记之触摸与手势
- iOS-布局-Masonry-优先级
- IOS 热更新,实时代码更新,动态更新,动态库framework
- 浅谈iOS开发.a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)
- IOS多线程开发之线程的状态
- iOS8以后推送通知需要访问权限
- IOS开发之Core Location
- ios 重签名
- IOS setNeedsDisplay setNeedsLayout注意
- iOS上抓包方法