简析响应者链条

谈到响应者链条,首先要有触摸事件和响应者。触摸事件就不解释了,那么什么是响应者?

一、响应者

在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之为“响应者对象”。例如:UIApplication、UIViewController、UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件。

二、事件的传递

有了触摸事件和响应者,就会产生响应者链条。发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中(为什么是队列不是栈,因为队列是顺序进出的,栈是先进后出的)。UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口keyWindow。由此开始从低往上寻找最合适的响应者,再从上往低寻找能处理事件的响应者即产生了响应者链条。

响应者链条就是由多个响应者对象连接起来的链条。能很清楚的看见每个响应者之间的联系,并且可以让一个事件多个对象处理。这个把事件传来又传回的过程也就是事件的传递。

三、如何找到最合适的响应者有一下步骤:

1> 自己是否能接收触摸事件?否,事件传递到此结束。

2> 触摸点是否在自己身上?否,事件传递到此结束。

3> 从后往前遍历子控件,重复前面的两个步骤。

4> 如果没有符合条件的子控件,那么就自己最适合处理。

注意1:如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件!

注意2:UIView不接收触摸事件的三种情况?1》不接收用户交互,userInteractionEnabled = NO; 2》隐藏,hidden = YES; 3》透明,alpha = 0.0 ~ 0.01;

提示:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的。

四、寻找能处理触摸事件的响应者过程

1、用户点击屏幕后产生的一个触摸事件,经过一系列的传递过程后,会找到最合适的响应者。找到最合适的响应者后,就会调用控件的touches方法来作具体的事件处理。touchesBegan、touchesMoved、touchedEnded等,这些touches方法的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理。到此可以得到事件传递的完整过程:

1> 先将事件对象由低往上传递(由父控件传递给子控件),找到最合适的响应者。

2> 调用最合适响应者的touches….方法来处理事件。

3> 如果调用了[super touches….];就会将事件顺着响应者链条往下传递,传递给上一个响应者。

4> 接着就会调用上一个响应者的touches….方法。

2、由响应者链条寻找上一个响应者的示意图

3、判断上一个响应者注意

1> 如果当前这个view是控制器的view,那么控制器就是上一个响应者

2> 如果当前这个view不是控制器的view,那么父控件就是上一个响应者

4、传递事件注意

1>如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图

2>在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理

3>如果window对象也不处理,则其将事件或消息传递给UIApplication对象

4>如果UIApplication也不能处理该事件或消息,则将其丢弃。

五、引入两个方法

1、- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

在寻找最合适的响应者的过程中,每个接收到事件的响应者都会调用这个方法。重写这个方法,并return nil,就可以拦截事件的传递,并把上一个响应者作为最合适的响应者。也可以返回某个特定控件,例如:return self.subviews[0]。

2、- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

在寻找最合适的响应者的过程中,判断点在不在方法调用者上面,即判断点在不在当前控件上面。重写方法,return NO;同样可以拦截事件传递。

结合使用这两个方法,可以实现神奇的效果。。

时间: 2024-10-10 01:02:33

简析响应者链条的相关文章

web应用构架LAMT及tomcat负载简析

Httpd    (mod_jk.so) workers.properties文件 uriworkermap.properties文件 <--AJP1.3--> Tomcat  --> jdk 大致流程:apache服务器通过mod_jk.so 模块处理jsp文件的动态请求.通过tomcat worker等待执行servlet/JSP的tomcat实例.使用 AJP1.3协议与tomcat通信.tomcat有借助jdk解析. 负载就是 多台tomcat.共同解析apache发送的jsp请

CentOS的网络配置简析

我们在进行对CentOS的网络配置时,一般会从IP地址(IPADDR).子网掩码(NETMASK).网关(Gateway).主机名(HOSTNAME).DNS服务器等方面入手.而在CentOS中,又有着不同的命令或配置文件可以完成这些配置操作,接下来,我们将从ifcfg系命令,iproute2系命令以及配置文件3个方面来简析网络配置的方法. 一.ifcfg系命令 ifcfg系命令包括ifconfig,route,netstat和hostname. 1.ifconfig命令 用来配置一个网络接口.

JDK源码简析--java.lang包中的基础类库

题记 JDK,Java Development Kit. 我们必须先认识到,JDK只是,仅仅是一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含量来说,还是在一个层级上,它们都是需要被编译成字节码,在JRE中运行的,JDK编译后的结果就是jre/lib下得rt.jar,我们学习使用它的目的是加深对Java的理解,提高我们的Java编码水平. 本系列所有文章基于的JDK版本都是1.7.16. 本节内容 在本节中,简析java.lang包所包

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

iOS中的事件传递和响应者链条 本文转自:http://www.linuxidc.com/Linux/2015-08/121270.htm 首先我们来看看ios中事件的产生和传递过程 1.发生触摸事件后,系统会将事件加入到一个由UIApplication管理的队列事件中来 2.UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常会发发送事件给应用程序的主窗口 3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件 4.找到合适的视图控件后,就会调用视图

经验模态分解法简析 (转)

http://blog.sina.com.cn/s/blog_55954cfb0102e9y2.html 美国工程院士黄锷博士于1998年提出的一种信号分析方法:重点是黄博士的具有创新性的经验模态分解(Empirical Mode Decomposition)即EMD法,它是一种自适应的数据处理或挖掘方法,非常适合非线性,非平稳时间序列的处理,本质上是对数据序列或信号的平稳化处理. 1:关于时间序列平稳性的一般理解: 所谓时间序列的平稳性,一般指宽平稳,即时间序列的均值和方差为与时间无关的常数,

Java Annotation 及几个常用开源项目注解原理简析

PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示例 Override Annotation Java 1 2 3 @Override public void onCreate(Bundle savedInstanceState); Retrofit Annotation Java 1 2 3 @GET("/users/{username}&quo

响应者链条

响应时间的完整处理过程: 1.先讲事件对象由上往下传递(由父控件传递给子控件),找到最合适的控件来处理这个事件 2.调用最合适控件的touches....方法 3.如果调用了[super touches...];就会将事件顺着响应者链条往上传递,传递给上一个响应者 4.接着就会调用上一个响应者touches...方法 什么事响应者链条? 1.响应者链条是由多个响应者对象链接起来的链条(什么是响应者对象:能处理事件的对象) 2.利用响应者链条,能让多个控件处理同一个触摸事件 3.怎么利用链条往上传

Linux网络性能优化方法简析

Linux网络性能优化方法简析 2010-12-20 10:56 赵军 IBMDW 字号:T | T 性能问题永远是永恒的主题之一,而Linux在网络性能方面的优势则显而易见,这篇文章是对于Linux内核中提升网络性能的一些优化方法的简析,以让我们去后台看看魔术师表演用的盒子,同时也看看内核极客们是怎样灵活的,渐进的去解决这些实际的问题. AD:2014WOT全球软件技术峰会北京站 课程视频发布 对于网络的行为,可以简单划分为 3 条路径:1) 发送路径,2) 转发路径,3) 接收路径,而网络性

.NET设计模式简析

首先,是设计模式的分类,我们知道,常用的设计模式共23种.但总体来说,设计模式氛围三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单列模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模版方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.转改模式.访问者模式.终结者模式.解释器模式. 另外还有并发型模式和线程池模式等. 介绍了分类,下面简单说下设计模式的六大原则