在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中事件的传递和响应者链条的更多相关文章

  1. iOS中的事件传递和响应者链条

    本文转自:http://www.linuxidc.com/Linux/2015-08/121270.htm 首先我们来看看ios中事件的产生和传递过程 1.发生触摸事件后,系统会将事件加入到一个由UI ...

  2. [学习总结]5、Android的ViewGroup中事件的传递机制(二)

    下面是第一篇的连接 Android的ViewGroup中事件的传递机制(一) 关于onInterceptTouchEvent和onTouchEvent的详细解释. 1 public class Mai ...

  3. [学习总结]4、Android的ViewGroup中事件的传递机制(一)

    本文主要针对dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent三个方法,通过简单的例子来简单的介绍下. 根据字面意思的理解,dispatchTo ...

  4. OS开发中的事件处理(二)-事件传递,响应者链条

    事件处理的事件传递 简介: 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件 队列中,UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理, ...

  5. iOS 中事件的响应链和传递链

    iOS事件链有两条:事件的响应链:Hit-Testing事件的传递链 响应链:由离用户最近的view向系统传递.initial view –> super view –> ….. –> ...

  6. iOS中事件传递过程

    iOS中,UIApplication管理着一个事件的队列,当系统获取用户的点击或滑动等事件后,就会将这些事件按顺序插入UIApplication管理的这个队里中,UIApplication再从这个队列 ...

  7. 史上最详细的iOS之事件的传递和响应机制

    前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view.寻找最合适的view的底层实现.拦截事件的处理)->找到最合适的view后 ...

  8. iOS之事件的传递和响应机制

    前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view.寻找最合适的view的底层实现.拦截事件的处理)->找到最合适的view后 ...

  9. iOS中消息的传递机制

    本文中,会经常提及接收者[recipient]和发送者[sender].在消息传递机制中具体是什么意思,我们可以通过一个示例来解释:一个table view是发送者,而它的delegate就是接收者. ...

随机推荐

  1. 深入研究java.lang.ProcessBuilder类

     深入研究java.lang.ProcessBuilder类 一.概述       ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它 ...

  2. WLLCM这五个字母全排列数目

           经过训练的话一眼看出来是5!/2!:我想的是先排WLCM那么是4!,5个位置,由于L左右两边的位置其实是一样的(再插入的还是L),索以结果是4*4!,这样重复了,看下图.         ...

  3. Seven Python Tools All Data Scientists Should Know How to Use

    Seven Python Tools All Data Scientists Should Know How to Use If you’re an aspiring data scientist, ...

  4. HttpOnly

    Contents 1 Overview 1.1 Who developed HttpOnly? When? 1.2 What is HttpOnly? 1.3 Mitigating the Most ...

  5. python:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xef in position xxx: ordinal not in range(128)

    执行sql_cmd = "select * from item_base where item_id in " + item_ids_str时报错 solve: import sy ...

  6. 深度观察:腾讯收购大众点评背景下的O2O大格局

    [亿欧导读] 腾讯入股大众点评获得20%股权,详情解读:①大众点评:独立自主为底线,要钱大于要流量:②腾讯:承认原生活服务O2O失败,丰富移动支付应用场景:③美团承受压力,拉手窝窝继续苦等买家:④BA ...

  7. grab jpegs from v4l2 devices

    某些平台下opencv不能直接直接支持摄像头获取图片或视频,这是需要使用v4l2(video for linux 2) 测试v4l2是否可以读到摄像头的内容,最简单的办法就是读取一张截图. v4l2g ...

  8. 批量生成卡号密码的php程序

    <?php header('Content-Type:text/html; charset=utf-8'); function MakeCard() { set_time_limit(0); / ...

  9. javascript小游戏--生命游戏

    昨天参加Code Retreat的活动,"Code Retreat是一个一天的集中练习的活动,专注于软件开发和设计的基础". 要了解更多信息可前往 CodeRetreat官网 通过 ...

  10. OpenCV学习笔记:矩阵的掩码操作

    矩阵的掩码操作很简单.其思想是:根据掩码矩阵(也称作核)重新计算图像中每个像素的值.掩码矩阵中的值表示近邻像素值(包括该像素自身的值)对新像素值有多大影响.从数学观点看,我们用自己设置的权值,对像素邻 ...