当我们设计app的时候,我们很可能想动态的响应事件。例如,触摸一个拥有许多不同对象的屏幕,你要决定给哪个对象一个响应事件,怎么样对象接收到事件。

当一个用户产生事件发生时(如 点击),UIKit产生一个对象,这个包含要被处理的对象的信息。接着把事件对象放到active app's(一个application对象,负责初始化用户事件路由、从全局管理一个运行的application)事件队列中。对于触摸事件,这个对象是一组触摸,打包放在UIEvent对象。对motion事件而言,事件对象根据你使用框架的不同和你感兴趣的motion事件类型而有所差异。

一个事件对象沿一个明确的路径传递,直到有个对象可以处理它。首先,单例UIApplication对象从队列的顶部取一个事件,并进行分发处理。一般,UIApplication对象把事件发给应用的key window 对象,key window对象传递给一个initial对象来处理。这个initial对象取决于事件的类型。

  • Touch events。对于触摸事件,window对象首先尝试将事件发送给事件发生的view(hit-test view)。找到hit-test view的过程被称为hit-testing(我们将在后边谈到)。
  • Motioin and remote control enents。这类事件,window对虾ing发送shaking-motion或者remote control event给第一响应者处理。

事件路径(event paths)的终极目标是找到一个对象来处理响应一个事件。因此,UIKit首先把这个事件发送给最适合处理这个时间的对象。对于触摸事件,这个对象是hit-test view;对于其他事件,这个对象是第一响应者。下面的部分介绍关于确定hit-test view 和 第一响应者的更多细节。

Hit-Testing Returns the View Where a Touch Occurred(hit-test返回触摸发生的view)。有的地方翻译感觉很别扭,为了避免误导(真的有人看吗?),原文贴上。

iOS use hit-testing fo find the view that is under a touch. Hit-testing involves checking whether a touch is within the bounds fo any relevant(更多强调直接相关) view objects. If it is, it recursively checks all of that view's subviews. The lowest view in the view hierarchy that contains the touch point becomes the hit-test view. After iOS determines the hit-test view, it passes the touch event to that view for handling.

举例说明,假设用户在View E中触摸,iOS通过用下面的次序检查subviews来查找hit-test view:

  1. 触摸在view A的bounds内,所以检查subview B和C;
  2. 触摸不在View B的bounds内,但在View C的bounds内,所以检查subview D和E;
  3. 触摸不在View D的bounds内,但在view E的bounds内。
    View E is the lowest view in the view hierarchy that contains the touch, so it becomes the hit-test view.

hitTest:withEvent: 方法返回一个CGPoint和UIEvent的hit-test view。 hitTest:withEvent: 方法开始执行通过view本身调用 pointInside:withEvent: 方法。如果传入pointInside:withEvent:的点在view的bounds内,pointInside:withEvent:返回YES。接着,在这个view的每个subview上调用hitTest:withEvent:。

传入hitTest:withEvent:的点不在view的bounds中得情况不细说了。

注意:一个触摸事件在它的整个生命周期中和它的hit-test view相关联,即使稍后触摸移出了这个view。

hit-test view被给予了第一次来处理触摸事件的机会。如果hit-test view不能处理这个事件,事件将沿这个view的响应者链条往下走,直到找到一个可以处理事件的对象。

The Responder Chain Is Made Up of Responder Objects(响应者链条由响应者组成-。-)

许多类型的事件以来响应链条传递事件。响应者链条是一系列连起来的响应者对象。以第一响应者开始,结束语application对象。如果第一响应者不能处理一个事件,它就转发给响应者链条中的下一个响应者。

responder object is an object that can respond to and handle events. The  UIResponder  class is the base class for all responder objects, and it defines the programmatic interface not only for event handling but also for common responder behavior. Instances of the UIApplicationUIViewController, and UIView classes are responders, which means that all views and most key controller objects are responders. Note that Core Animation layers are not responders.

第一响应者被指定首先接受事件。通常,第一响应者是一个view对象。一个对象可以变成第一响应者通过做下面两件事:

  1. 重写 canBecomeFirstResponder 方法,返回YES;
  2. 接受一个 becomeFirstResponder 消息。如果必要,一个对象可以给自己发送这条消息。

依赖响应者链条的对象不止事件对象。响应者链条可以用在下面的地方:

  1. Touch events.
  2. Motion events.
  3. Remote control events.
  4. Action messages.
  5. Editing-menu messages.
  6. Text editing.

UIKit自动设置用户点击的text field 或 text view成为第一响应者;Apps必须显式设置所有其他的第一响应者,用becomeFirstResponder方法。

更多更详细内容:https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/event_delivery_responder_chain/event_delivery_responder_chain.html

http://www.cnblogs.com/xjshi/p/4356018.html

Event Delivery: The Responder Chain(事件传递,响应链)的更多相关文章

  1. 【IOS笔记】Event Delivery: The Responder Chain

    Event Delivery: The Responder Chain  事件分发--响应链 When you design your app, it’s likely that you want t ...

  2. Event Handling Guide for iOS--(三)---Event Delivery: The Responder Chain

    Event Delivery: The Responder Chain 事件传递:响应链 When you design your app, it’s likely that you want to ...

  3. iOS开发 - 事件传递响应链

    序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了“单击”这一行为,操作系统把包含这些点击事件的信息包装成UITouch和UI ...

  4. iOS 事件传递响应链

    iOS中加载的时候会先执行main函数 int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain( ...

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

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

  6. 事件分发&响应链

    iOS的三种事件:触摸事件/运动事件/远程控制事件 typedef enum { UIEventTypeTouches, UIEventTypeMotion, UIEventTypeRemoteCon ...

  7. Android 手机卫士--事件传递&响应规则

    问题的提出: 本文地址:http://www.cnblogs.com/wuyudong/p/5911187.html ,转载请注明源地址. 前面的文章实现了点击SettingItemView条目的时候 ...

  8. 消息点击事件的响应链---hitTest:withEvent:方法

    *当用户点击屏幕时,会产生一个触摸事件,系统会将触摸事件加入到 UIApplication管理事件队里中 *UIApplication 会从事件队列中取出最前面的事件进行分发以便处理,通常,先发送事件 ...

  9. Events and Responder Chain

    事件类型(Event Type) iOS 有三种事件类型: 触控事件(UIEventTypeTouches):单点.多点触控以及各种手势操作: 传感器事件(UIEventTypeMotion):重力. ...

随机推荐

  1. 【HAOI2007】理想的正方形

    [问题描述] 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. [输入] 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行 ...

  2. Android之声音管理器《AudioManager》的使用以及音量控制

    以下为网上下载然后拼接-- Android声音管理AudioManager使用 手机都有声音模式,声音.静音还有震动,甚至震动加声音兼备,这些都是手机的基本功能.在Android手机中,我们同样可以通 ...

  3. eclipse慢 优化(转)

    1.打开 eclipse.ini -showsplash com.genuitec.myeclipse.product --launcher.XXMaxPermSize 256M -vmargs -D ...

  4. HDU 5224 Tom and paper(最小周长)

    HDU 5224 Tom and paper(最小周长) Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d &a ...

  5. JLRoutes--处理复杂的URL schemes-备

    关键字:URL,URL schemes,Parse  代码类库:网络(Networking) GitHub链接:https://github.com/joeldev/JLRoutes   JLRout ...

  6. 转:zookeeper3.4.5安装笔记

    文章来自于:http://mmicky.blog.163.com/blog/static/150290154201392893623943/   1:解压 官网zookeeper.apache.org ...

  7. 转:前端集锦:十款精心挑选的在线 CSS3 代码生成工具

    今天这篇文章向大家推荐十款非常有用的在线 CSS3 代码生成工具,这些工具能够帮助你方便的生成 CSS3 特效.CSS3 是对 CSS 规范的改善和增强,增加了圆角.旋转.阴影.渐变和动画等众多强大的 ...

  8. Centos6.x 64位 安装JDK

    JDK下载地址: http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk7-downloads-1880260-zhs.html ...

  9. 转:php连接oracle设定字符集,避免乱码

    原文来自于:http://muyu.iteye.com/blog/399884 数据库用oracle,当php连接oracle的时候,最好指定字符集. 查PHP手册,oci_connect的第四个参数 ...

  10. 199bit总结的影响最大的十个算法

    1. 归并排序(MERGE SORT).快速排序(QUICK SORT)和堆积排序(HEAP SORT) 哪个排序算法效率最高?这要看情况.这也就是我把3种算法放在一起讲的原因,可能你更常用其中一种, ...