iOS中事件的传递和响应者链条
在iOS 开发中,常见的事件有三种类型,分别是:
(1)触摸事件:平常手指在屏幕上滑动,产生的事件都是触摸事件
(2)加速计事件:微信的摇一摇就是典型的加速计事件
(3)远程控制事件:耳机控制歌曲上一首、下一首、暂停就是远程控制事件的应用。
在触摸事件中,通常情况下,点击哪个控件,哪个控件就会产生反应。比如说,点击确定按钮,确定按钮会响应该事件,点击取消按钮,取消按钮会响应该事件。那么,系统是如何决定哪一个视图(控件)来响应该事件呢?
当发生触摸事件后,系统会将该事件加入到一个由 UIApplication 管理的队列中,UIApplication 会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口。主窗口会在整个视图层次结构中找到一个最合适的视图来处理该触摸事件。找到合适的视图控件后,就会调用该控件响应的方法来处理触摸事件,常用的方法有:
touchesBegan...
touchesMoved...
touchesEnded...
touchesCancelled...
在app 开发中,一个控制器下通常不止一个控件,那么发生触摸事件后,哪一个控件是最合适处理该事件的呢?
在确定最合适控件的过程中,遵循以下原则:
(1)判断自己能否接收触摸事件,如果不能,直接返回;如果能,到第(2)步
(2)判断触摸点是否在自己身上,如果不在,直接返回;如果在,到第(3)步
(3)从后往前遍历子控件,重复前两步
(4)如果没有符合条件的子控件,那么自己就是最适合处理该触摸事件的控件。
举例如下:

其中,绿色view和橙色 view都是白色view的子控件(假设先加入了绿色view,后加入了橙色view),蓝色view和红色view都是橙色view的子控件,黄色view是蓝色view的子控件。
当点击绿色view时,事件先传递到白色view。白色view满足条件(1),到步骤2,触摸点在自己身上,到步骤3,对橙色view做步骤(1)和步骤(2),不满足步骤(2),回退,对绿色view做步骤(1)和步骤(2),均满足,到步骤(3),没有子控件,到步骤(4),自己就是最合适的控件(绿色view)。整个的流程如下:
白色view --->橙色view(橙色view不满足步骤2,因此遍历绿色view)
---->绿色view(满足步骤1和步骤2),没有子控件,所以绿色view是最适合处理该触摸事件的控件。
当点击黄色view时,流程如下:
白色view --->橙色view --->红色view(红色view覆盖了蓝色view,可知红色view是后加入的。红色view不满足条件2,因此到蓝色view)
--->蓝色view --->黄色view(黄色view没有子控件,所以黄色view是最适合处理该触摸事件的控件)。
也就是说,在寻找最合适的子视图时,是从父视图控件开始,一层一层向下寻找的。
在找到最合适的视图控件后,就会调用控件的 touchesBegan... 等方法。这些touches的默认做法是将事件顺着响应者链条向上传递,交给上一个响应者处理。
假设点击了上图中的黄色控件,如果黄色控件不处理该触摸事件,会将该事件交给蓝色控件处理;如果蓝色控件不处理该控件,会将该控件交给橙色控件处理;如果橙色控件不处理该事件,会将该事件交给白色控件来处理;如果白色控件不处理该事件,白色控件会交给控制器来处理;如果控制器不处理该事件,控制器会交给主窗口处理该事件;如果主窗口不处理该事件,主窗口会交给UIApplication来处理该事件;如果UIApplication也不处理该事件,则该事件会被丢弃,不做处理。因此说,事件的处理过程是顺着响应者链条向上传递的。
示意图如下:

左侧是单控制器,右侧是多控制器。
响应者链的事件传递过程总结如下:
1.如果view的控制器存在,就传递给控制器处理;如果控制器不存在,则传递给它的父视图
2.在视图层次结构的最鼎城,如果也不能处理收到的事件,则将事件传递给window对象进行处理
3.如果window对象也不处理,则将事件传递给 UIApplication对象
4.如果UIApplication也不能处理该事件,则将该事件丢弃。
上传一个验证响应者链的代码(MJ所写)
http://files.cnblogs.com/files/acBool/06-%E5%93%8D%E5%BA%94%E8%80%85%E9%93%BE%E6%9D%A1.zip
iOS中事件的传递和响应者链条的更多相关文章
- iOS中的事件传递和响应者链条
本文转自:http://www.linuxidc.com/Linux/2015-08/121270.htm 首先我们来看看ios中事件的产生和传递过程 1.发生触摸事件后,系统会将事件加入到一个由UI ...
- [学习总结]5、Android的ViewGroup中事件的传递机制(二)
下面是第一篇的连接 Android的ViewGroup中事件的传递机制(一) 关于onInterceptTouchEvent和onTouchEvent的详细解释. 1 public class Mai ...
- [学习总结]4、Android的ViewGroup中事件的传递机制(一)
本文主要针对dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent三个方法,通过简单的例子来简单的介绍下. 根据字面意思的理解,dispatchTo ...
- OS开发中的事件处理(二)-事件传递,响应者链条
事件处理的事件传递 简介: 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件 队列中,UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理, ...
- iOS 中事件的响应链和传递链
iOS事件链有两条:事件的响应链:Hit-Testing事件的传递链 响应链:由离用户最近的view向系统传递.initial view –> super view –> ….. –> ...
- iOS中事件传递过程
iOS中,UIApplication管理着一个事件的队列,当系统获取用户的点击或滑动等事件后,就会将这些事件按顺序插入UIApplication管理的这个队里中,UIApplication再从这个队列 ...
- 史上最详细的iOS之事件的传递和响应机制
前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view.寻找最合适的view的底层实现.拦截事件的处理)->找到最合适的view后 ...
- iOS之事件的传递和响应机制
前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view.寻找最合适的view的底层实现.拦截事件的处理)->找到最合适的view后 ...
- iOS中消息的传递机制
本文中,会经常提及接收者[recipient]和发送者[sender].在消息传递机制中具体是什么意思,我们可以通过一个示例来解释:一个table view是发送者,而它的delegate就是接收者. ...
随机推荐
- 用JavaScript获取一个超链接的绝对URL地址
对于Web程序员来说,处理简单的URL格式也许会成为一场噩梦.试想一下,一个网址里有很多组成部分都会影响你对它的解析方法: 是否以/字符开头 是否以//开头 是否以?号开头 是否以#号开头 …等等 当 ...
- android fragment嵌套fragment出现的问题:no activity
package com.example.fragmentNavigation2.fragment; import android.content.Context; import android.os. ...
- SQL模糊查询与删除多条语句复习
string IDlist="1,2,3"; 批量删除数据 StringBuilder strsql=new StringBuilder(); strSql.Append(&quo ...
- ANDROID_MARS学习笔记_S01原始版_022_MP3PLAYER002_本地及remote标签
一.简介 1.在main.xml中用TabHost.TabWidget.FrameLayout标签作布局 2.在MainActivity中生成TabHost.TabSpec,调用setIndicato ...
- Autodesk 2014全套密钥
AUTODESK 2014通用安装序列号: 666-69696969 667-98989898 400-45454545 066-66666666 AUTODESK 2014全系列产品密钥 001F1 ...
- Hadoop家族学习路线图
主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, Chukwa,新增加的项 ...
- BZOJ3530: [Sdoi2014]数数
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 322 Solved: 188[Submit][Status] ...
- windows log
http://technet.microsoft.com/zh-CN/sysinternals http://technet.microsoft.com/en-us/sysinternals/bb89 ...
- Curl之Post Json
curl Post Json $ curl -i -X POST -H "'Content-type':'application/x-www-form-urlencoded', 'chars ...
- [POJ1477]Box of Bricks
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 19503 Accepted: 7871 Description Litt ...