在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

转载于:https://www.cnblogs.com/acBool/p/5064882.html

iOS中事件的传递和响应者链条相关推荐

  1. iOS中“事件”的前因后果

    iOS的事件是一个由触发行为到响应的过程.本文旨在表达事件如何处理响应,如何传递事件的. 1. 前言 国内智能手机要从2000年开始说起,手机的进化是飞速的,单从操作来看,最开始是数字实体键盘,后来出 ...

  2. Android中事件的传递

    Android中事件的传递 首先来张图看看    1. 核心方法返回值的含义 dispatchTrackballEvent 分发事件 public boolean dispatchTrackballE ...

  3. iOS 中的事件传递和响应机制 - 实践篇

    注:根据史上最详细的iOS之事件的传递和响应机制-实践篇重新整理(适当删减及补充). 示意图说明:白色 view 是蓝色 view 的父视图:蓝色 view 是橙色 view 的父视图. 需求一:点击 ...

  4. IOS中的事件响应链,事件冒泡机制基本了解

    本文主要讲解IOS中事件响应链,即事件冒泡机制.做过web开发的同学应该知道js事件冒泡是从主响应元素一层一层的向父级冒泡事件,在ios亦是如此,但是不同是ios中,如果冒泡链中有一方对事件进行响应处 ...

  5. ios 触摸事件 学习

    好奇触摸事件是如何从屏幕转移到APP内的? 困惑于Cell怎么突然不能点击了? 纠结于如何实现这个奇葩响应需求? 亦或是已经被响应链.手势.target-action这一系列响应触摸事件的方式折腾到不 ...

  6. iOS中响应者链条-触摸事件,hitTest方法坐标转换

    总体来说,分2个步骤: 一,从上到下寻找合适的控件来处理这个触摸事件.如下图,如果点击了黄色4,则UIApplication -> UIWindow -> 1白色 -> 2橙色 -& ...

  7. iOS底层原理探究 第一探. 事件传递和响应者链

    一. 声明:  本文意在探讨, 也参考了几位大神的文章, 在最后我会把链接发出来, 如果有理解错误的地方, 请大神们指正哈! 二. 前言:  最近自己做项目的时候, 用到了UITabbarContro ...

  8. iOS中触摸事件传递和响应原理

    系统响应阶段 1.手指触碰屏幕,屏幕感受到触摸后,将事件交由IOKit来处理. 2.IOKIT将触摸事件封装成IOHIDEvent对象,并通过mach port传递给SpringBoard进程. ma ...

  9. iOS开发触摸事件的传递

    1. iOS中的三种事件类型 触摸事件.加速计事件.远程事件. 触摸事件:通过触摸.手势进行触发(例如手指点击.缩放) 加速计事件:通过加速器进行触发(例如手机晃动,典型应用是微信摇一摇) 远程事件: ...

最新文章

  1. wxWidgets:wxMouseCaptureLostEvent类用法
  2. HTTP清晰的学习笔记
  3. eclipse 中配置外部 tomcat 的debug
  4. python的应用会超过java吗_JAVA会被Python超越成为世界上第一大编程语言吗?
  5. Oracle密码过期怎么办
  6. IO编程(对IO是什么的详解)
  7. CMD编写bat病毒
  8. html怎么取消打印空白页,怎么取消打印空白页:如何删除Excel工作表中的空白页...
  9. 深度学习笔记 —— 微调
  10. List集合排序Collections.sort()方法的一个容易忽略的小问题
  11. 使用nginx配置服务器80端口指向多个服务,解决微信公众号等平台只能绑定80端口问题。
  12. Facade Design
  13. pg高可用之repmgr(一)
  14. 5V降压1.8V芯片,稳压电路设计建议PW2059
  15. iOS 调试:DerekSelander【 LLDB aliases/regexes and Python scripts to aid in your debugging sessions】
  16. 高数 | 【数一专项】真题回顾整理及知识点总结
  17. 火车售票系统设计 c语言,C语言火车售票系统
  18. 如何将SketchUp的模型导入PPT?
  19. 小清新毕业论文答辩PPT (2)
  20. java计算机毕业设计国外摇滚乐队交流和周边售卖系统MyBatis+系统+LW文档+源码+调试部署

热门文章

  1. centos 7 lvm用法
  2. MongoDB 安装记录
  3. 胜过对手,先从微笑开始
  4. liunx下NetworkManager导致网卡不能启动
  5. 服务器安装什么文件可以获取密码,服务器ssh密码在哪获取
  6. 软件项目文档_什么是软件项目的好的文档?
  7. cpu负载转移内存_为什么将所有工作负载转移到云中是个坏主意
  8. (34)css光标属性cursor
  9. 实践 | 在MySql中,这四种方法可以避免重复插入数据!
  10. Windows固态硬盘,unbuntu机械硬盘双系统方案