欢迎光临传输带网站,我们是一家生产线开发、制造、安装一体的公司

传输带

传输带产品性能稳定价格合理

[链传输速度]事件传输:响应链(翻译)

作者:以沫      发布时间:2021-04-15      浏览量:0
设计应用程序时,您可能需要动态响应

设计应用程序时,您可能需要动态响应事件。例如,触摸事件可以由屏幕上的许多对象生成。您必须决定哪个对象响应相应的事件,并了解对象如何接收事件。

当用户生成事件时,UIKit创建一个事件对象,其中包含处理事件所需的信息。然后将此事件对象放入全局事件队列中。触摸事件被包装为UIEvent对象。行动事件会根据你使用的框架和你感兴趣的行动事件而有所不同。

事件沿着特定的路径传递,直到对象能够处理它。首先,

UIApplication singleton对象将从事件队列中获取一个事件并分发它,并且总是将该事件发送到应用程序的关键窗口对象。key window对象会将事件传递给原始对象进行处理,根据事件的类型,原始对象会有所不同。

触摸事件。对于触摸事件,窗口对象首先尝试将事件传递给生成触摸事件的视图。这个视图叫做命中测试视图,寻找命中测试视图的过程叫做命中测试。

动作和遥控事件。窗口对象将震动动作或遥控事件发送给第一响应者进行处理。

这些事件路径的最终目标是找到一个可以处理和对应一个事件的对象。因此,UIKit首先将事件发送到最适合处理事件的对象。最适合处理触摸事件的对象是点击测试视图,对于其他事件,该对象是第一响应者。下一节将展开点击测试视图,并详细介绍如何确认第一个响应对象。

点击测试返回触摸事件发生的视图

IOS使用点击测试来找到触摸的视图。点击测试需要检查触摸事件是否在相关视图对象的范围内。如果是这样,它将递归地检查视图对象的所有子视图。视图层次结构中包含接触点的最底部视图将成为点击测试视图。当iOS确定点击测试视图时,它会将触摸事件扔给该视图进行处理。

例如,假设用户触摸视图e(图2-1)。IOS按照以下顺序从子视图中查找命中测试视图。

1.触摸点在视图a中,因此将检查子视图b和c。

2.触摸点不在视图b的范围内,但在视图c的范围内,因此它将检查子视图d和e。

3.触摸点不在视图d中,但在视图e的范围内。

视图e是视图层次结构中包含触摸点的底部视图,因此它成为点击测试视图。

(hitTest:withEvent:)方法返回给定CGPoint和UIEvent的点击测试视图。(hitTest:withEvent:)方法由(pointInside:withEvent:)方法调用。如果一个点被(hitTest:withEvent:)方法判断为在视图的范围内,(Point Inside 3360 with Event :)方法将返回YES。然后,该方法递归调用(hitTest:withEvent:)子视图上返回YES的方法。

如果(hitTest:withEvent:)方法判断此点在视图范围之外,则第一个调用的(pointInside:withEvent:)方法将返回no。如果忽略此点,(hitTest:withEvent:)方法将返回nil。如果子视图返回“否”,视图层次结构中的整个分支将被忽略,因为如果该触摸点不是在该视图中生成的,它也不会在该视图的子视图中生成。这意味着父视图之外的子视图中的一些点不能接收触摸事件,因为触摸点必须在父视图和子视图的范围内。当子视图的范围超过父视图的范围时,子视图的“剪辑边界”属性被设置为“否”

注意:触摸对象的生命周期将与其命中测试密切相关,即使触摸稍后移出视图。

点击测试视图第一次有机会处理触摸事件。如果点击测试视图不能处理事件,事件将在视图的响应者链中传输,直到系统找到可以找到事件的对象。

响应者链由响应者对象组成

许多类型的事件依赖于一连串的响应者来传递。响应者链是一系列响应者对象。它从第一个响应者开始,到应用程序对象结束。如果第一个响应者无法处理事件,该事件将被转发给响应者链中的下一个响应者。

响应对象是可以处理事件的对象。UIResponder类是所有响应者对象的基类,它不仅为事件处理定义了程序接口,也为普通的响应者行为定义了程序接口。UIApplication、UIViewController和UIView实例都可以是响应者,这意味着所有视图和许多关键控制器对象都可以是响应者。注意:没有一个核心动画层可以是应答者。

事件首先由第一响应者接收。一般第一响应者是视图对象。对象通过以下两种方式成为第一响应者:

1.复制方法(堪培拉第一响应者)并返回是。

2.接收(成为第一响应者)消息。如果需要,对象可以将此消息发送给自己。

注意:在对象成为第一个响应者之前,请确保应用程序已经呈现了该对象的层。例如,我们通常在(viewDidAppear:)方法中调用(变成事件响应)

er)方法,如果尝试在(viewWillAppear:)方法里面分配第一响应者,对象的图层还没有渲染出来,所以(becomeFirstResponder)方法就会返回NO。

事件不是唯一的依赖响应者链条的对象。响应者链条被用于以下的情况:

· 触摸事件。如果hit-test视图不能处理一个触摸事件,那么这个事件就会从hit-test视图开始沿着响应者链条传递。

· 动作事件。通过UIKit来处理摇一摇动作事件,第一响应者必须实现UIResponder类的(motionBegan:withEvent:)方法或者(motionEnded:withEvent:)方法之一。

· 远程控制事件。第一响应者处理远程控制事件必须实现UIResponder类的(remoteControlReceivedWithEvent:)方法。

· 动作信息。