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{// 将事件传递给 nextResponderid 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的事件传递响应 ...
随机推荐
- uinty3d使用ugui封装一个分页控件
我们在显示数据时有的数据比较多,手机内存有限,我们不可能分配很多的控件来显示这些数据,分页是一个不错的选择.比如玩家交易行.我们现在封装一个自己简单的分页控件来显示玩家交易行. 分页控件的原理其实很简 ...
- 关于FileSystemXmlApplicationContext和ClassPathXmlApplicationContext路径问题
在码代码的时候发现使用这两个方法写路径的时候总是存在问题,所以百度了一下解决了这个问题. 关于FileSystemXmlApplicationContext这个路径有2总写法 有盘符的代表的是绝对路径 ...
- PHP数组关于数字键名的问题
以下是对PHP数组数字键名的几点总结: 键名长度只能在 int 长度范围内,超过int 范围后将会出现覆盖等混乱情况 在键名长度为 int 范围内存取值时,PHP会强制将数字键名转换为 int 数值型 ...
- css基础和心得(二)
css中的某些样式是具有继承性的.它允许样式不仅应用于某个特定html标签元素 而且应用于其后代.如: p{color:red;} <p>dsffd<spans>sdfasd ...
- erase-credentials配置
转自:Spring Security怎样不让默认的ProviderManager清除密码等信息 <authentication-manager erase-credentials="f ...
- 语义化标签SEO
语义标签 title 和 h1 的区别,我的理解是: title 是整个网页的标题,突出整个网站的内容,H1 突出的是一篇文章的内容. b 与 strong 的区别,b只是样式的加粗,strong 是 ...
- reposync 同步yum仓库
reposync 同步远程yum仓库到本地 OPTIONS -h, --help 显示帮助 -c CONFIG, --config=CONFIG ...
- 安装器---Inno Setup
Inno Setup[1] 用Delphi写成,其官方网站同时也提供源程序免费下载.它虽不能与Installshield这类恐龙级的安装制作软件相比,但也当之无愧算是后起之秀.Inno Setup是 ...
- Python基础(十一)-面向对象
三种编程范式: 1.函数式编程:函数指数学意义上的函数 由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要的好处主要是不可变性带来的.没有可变的状态,函数就是引用透明(Ref ...
- Weex-语法笔记 一
p.p1 { margin: 0.0px 0.0px 2.0px 0.0px; font: 14.0px "PingFang SC Semibold"; color: #45454 ...