Events and Responder Chain
事件类型(Event Type)
iOS 有三种事件类型:
- 触控事件(UIEventTypeTouches):单点、多点触控以及各种手势操作;
- 传感器事件(UIEventTypeMotion):重力、加速度传感器等;
- 远程控制事件(UIEventTypeRemoteControl):远程遥控iOS设备多媒体播放等;
响应者对象(Responder Object)
responder object 是能够响应并处理事件的对象,是构成响应链和事件传递链的节点。
举个栗子,当手指去触摸屏幕上 UIView 的实例对象 aView。触摸的动作会产生一个触摸事件 UIEventTypeTouches,而接收触摸事件的对象 aView,就是一个 responder object。
一个事件有可能被多个 responder 接收,第一个接收事件的 responder 就叫 first responder。
在 iOS 中,几乎所有类都是 responder,比如 UIWindow、UIView、UIControl、UIControllers 等,而这些类都有一个共同的父类 —— UIResponder。UIResponder 声明了用于处理事件的接口,并定义了默认的行为。
Responder 继承链如下:
响应者链(responder chain)
当一个事件发生时,如果 first responder 不处理,事件就会继续往下传递,被下个 responder 接收,如果下个 responder 也不处理,又会被下下个 responder 接收…… 直到一个 responder 处理了事件或者没有 responder 了。这些 responder 按照传递次序连接起来的链条就构成了响应者链。
iOS 上的响应者链:
由于不同的 app 内的布局和层次结构的不同,响应顺序也会有所不同,但事件的传递路径会遵守基本规则。从图中可以看到,响应者链有以下特点:
响应者链通常是由 initial view 开始;
UIView 的 nextResponder 它的 superview;如果 UIView 已经是其所在的 UIViewController 的 top view,那么 UIView 的 nextResponder 就是 UIViewController;
UIViewController 如果有 Super ViewController,那么它的 nextResponder 为其 Super ViewController 最表层的 View;如果没有,那么它的 nextResponder 就是 UIWindow;
UIWindow 的 contentView 指向 UIApplication,将其作为 nextResponder;
UIApplication 是一个响应者链的终点,它的 nextResponder 指向nil,整个 responder chain 结束。
需要说明是,如果当前的 responder 不处理事件,并希望将其传递给 nextResponder 时,需要手动编写代码,才会继续往下传递,否则事件会被废弃。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 将事件传递给 nextResponder
id theNextResponder = [self nextResponder];
[theNextResponder touchesBegan:touches withEvent:event];
}
Hit-Test View 与 Hit-Testing
当用户与 iPhone 的触摸屏产生互动时,硬件就会探测到物理接触并且通知操作系统。操作系统就会创建相应的事件,并将其传递给当前正在运行的应用程序的事件队列。然后这个事件会被事件循环传递给优先响应对象,即 Hit-Test View 。
Hit-Test View 就是事件被触发时和用户交互的对象,寻找 Hit-Test View 的过程就叫做 Hit-Testing。
首先假设现在有如下这么一个 UI 布局,一种有 A B C D E 五个视图。
假设用户触摸了上图的 View E 区域,那么 iOS 将会按下面的顺序反复检测 subview 来寻找 Hit-Test View
- 触摸区域在视图 A 内,所以检测视图 A 的 subview B 和 C;
- 触摸区域不在视图 B 内,但是在视图 C 内,所以检查视图 C 的 subview D 和 E;
- 触摸区域不在视图 D 内,在视图 E 中;
视图 E 在整个视图体系中是 lowest view,所以视图 E 就是 Hit-Test View 。
总结
所以关于事件的链有两条:事件的响应链;Hit-Testing 时事件的传递链。
响应链:由离用户最近的view向系统传递。
initial view –> super view –> …..–> view controller –> window –> Application –> AppDelegateHit-Testing 链:由系统向离用户最近的view传递。
UIKit –> active app's event queue –> window –> root view –>……–>lowest view
参考文档
[1] iOS Developer Library: Event Handling Guide for iOS
[2] iOS Developer Library: UIKit Framework Reference
[3] Cocoa Application Competencies for iOS: Responder Object
[4] Drobnik KG: The Amazing Responder Chain
[5] 啸笑天: iOS 手势及触摸
[6] 易荣义: 事件传递之响应链(Event Delivery: The Responder Chain)[译]
[7] 《随堂笔记iOS UI课程》—— 事件,响应者链,容器视图控制器
[8] 墨半成霜: Responder一点也不神秘 —— iOS用户响应者链完全剖析
[9] 唐韧_Ryan: iOS事件机制(一)
[10] 唐韧_Ryan: iOS事件机制(二)
Events and Responder Chain的更多相关文章
- 【IOS笔记】Event Delivery: The Responder Chain
Event Delivery: The Responder Chain 事件分发--响应链 When you design your app, it’s likely that you want t ...
- hitTest:WithEvent 和Responder Chain
这个方法是找到那个View被touch,当找到后就成为响应链的第一个了,如果他不能处理这个Event,那么就找nextResponder 直至application 如果不能处理,那就会丢弃掉. ht ...
- Event Delivery: The Responder Chain(事件传递,响应链)
当我们设计app的时候,我们很可能想动态的响应事件.例如,触摸一个拥有许多不同对象的屏幕,你要决定给哪个对象一个响应事件,怎么样对象接收到事件. 当一个用户产生事件发生时(如 点击),UIKit产生一 ...
- View Controller Programming Guide for iOS---(八)---Using View Controllers in the Responder Chain
Using View Controllers in the Responder Chain 响应链中使用视图控制器 View controllers are descendants of the UI ...
- Event Handling Guide for iOS--(三)---Event Delivery: The Responder Chain
Event Delivery: The Responder Chain 事件传递:响应链 When you design your app, it’s likely that you want to ...
- iOS - Responder Chain
在iOS中,当发生事件响应时,必须知道由谁来响应事件.这就是由响应者链来对事件进行响应,所有事件响应的类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次 ...
- iOS Responder Chain 响应者链
一.事件分类 对于IOS设备用户来说,他们操作设备的方式主要有三种:触摸屏幕.晃动设备.通过遥控设施控制设备.对应的事件类型有以下三种: 1.触屏事件(Touch Event) 2.运动事件(Moti ...
- iOS-响应链(Responder Chain)
2017.05.08 20:40* 字数 1306 阅读 740评论 6喜欢 9 工作接近一年,很久没有更新博客.工作中学到很多知识点后面将花时间整理,作为对一年知识学习的总结: 下面是本篇博客的写作 ...
- iOS事件响应链(Responder Chain)
概述 在iOS中,视图的层级一般都是 父视图->添加各种子视图.这时候某个视图(子视图)上有个按钮,需要我们交互.但是有时候我们会发现无论如何都没有反应.这时候可能就是我们对iOS的事件传递响应 ...
随机推荐
- AppCan 双击返回按钮退出应用
使用AppCan开发手机应用,拦截返回键实现自定义2秒内双击退出应用的操作 var c1c = 0; window.uexOnload = function(type){ uexWindow.setR ...
- FZU 2240 Daxia & Suneast's problem
博弈,$SG$函数,规律,线段树. 这个问题套路很明显,先找求出$SG$函数值是多少,然后异或起来,如果是$0$就后手赢,否则先手赢.修改操作和区间查询的话可以用线段树维护一下区间异或和. 数据那么大 ...
- Unity2D开发小细节
当某个触碰物体挂在父组件时,如果当前子组件不加rigidbody,会默认使用父组件的rigidbody
- web service client端调用服务器接口
打开项目的web service client 其中wsdl URL http://www.51testing.com/html/55/67755-848510.html 去这里面查找一些公开的 ...
- centos7如何安装pandoc
1 Install stack 1.1 Add the appropriate source repository: curl -sSL https://s3.amazonaws.com/downlo ...
- VB ListBox 添加横向滚动条
Private Declare Function SendMessage Lib "user32 " Alias "SendMessageA" (ByVal h ...
- 设计模式-GoF23
书呢,是2012年双11买的. 没有面向对象程序经验的人,果然还是看不懂的.
- vs2010帮助文档下载以及帮助查看器(H3Viewer)的使用
在工作中遇到想查看vs2010的帮助文档.推荐使用H3Viewer.一个第三方的免费软件,独立于VS2010运行的帮助查看器.这方面的资料并不多.把本次自己使用的心得分享给大家. H3Viewer官方 ...
- SpringMVC 系列教程1-文件上传-配置
SpringMVC默认没有配置上传解析器 使用SpringMVC来处理上传必须添加对MultipartResolver上传解析器的声明配置. 配置之后,客户端每次进行请求的时候,SpringMVC都会 ...
- html5+css3 文章的展示demo
index.html 页面的样式 <!DOCTYPE html><html lang="en"> <head> <title>l ...