ios中事件的响应链(Responder chain)和传递链

事件的响应链涉及到的一些概念

  • UIResponder类,是UIKIT中一个用于处理事件响应的基类。窗又上的所有事件触发,都由该类响应(即事件处理入又)。所以,窗又上的View及控制器都是 派生于该类的,例如UIView、UIViewController等。
  • 调用UIResponder类提供的方法或属性,我们就可以捕捉到窗又上的所有响应 事件,并进行处理。
  • 响应者链条是由多个响应者对象连接起来的链条,其中响应者对象是能处理事 件的对象,所有的View和ViewController都是响应者对象,利用响应者链条能 让多个控件处理同一个触摸事件.

如上图,响应者链有以下特点:

响应者链通常是由 initial view 开始;

  • UIView 的 nextResponder 它的 superview;如果 UIView 已经是其所在的 UIViewController 的 top view,那么 UIView 的 nextResponder 就是 UIViewController;
  • UIViewController 如果有 Super ViewController,那么它的 nextResponder 为其 Super ViewController 最表层的 View;如果没有,那么它的 nextResponder 就是 UIWindow;
  • UIWindow 的 contentView 指向 UIApplication,将其作为 nextResponder;
  • UIApplication 是 个响应者链的终点,它的 nextResponder 指向nil,整个

    responder chain 结束。

Hit-Test View 与 Hit-Testing

假设用户触摸了上图的 View E 区域,那么 iOS 将会按下面的顺序反复检测 subview 来寻找 Hit-Test View

  1. 触摸区域在视图 A 内,所以检测视图 A 的 subview B 和 C;
  2. 触摸区域不在视图 B 内,但是在视图 C 内,所以检查视图 C 的 subview D 和 E;
  3. 触摸区域不在视图 D 内,在视图 E 中;

视图 E 在整个视图体系中是 lowest view,所以视图 E 就是 Hit-Test View 。

事件的链有两条:事件的响应链;Hit-Testing 时事件的传递链。

  • 响应链:由离 户最近的view向系统传递。 initial view –> super view –> .....–> view controller –> window –> Application –> AppDelegate
  • Hit-Testing 链:由系统向离 户最近的view传递。 UIKit –> active app‘s event queue –> window –> root view –>......–>lowest view
时间: 2024-10-12 04:04:37

ios中事件的响应链(Responder chain)和传递链的相关文章

iOS开发——响应链(Responder Chain)的深入理解和代码示例

我在之前一篇博客<iOS响应者链Responder Chain浅析>中对iOS开发中遇到的响应者链概念有了基本的了解.但是仅仅停留在理解概念的基础上还是远远不够的.该博客我们会通过代码案例来深入理解响应链.该博客的示例上传至 https://github.com/chenyufeng1991/ResponderChain  . (1)首先来说说第一响应者(First Responder).响应事件的传递过程就是为了找到第一响应者.以下几个方法: isFirstResponder:判断该View

iOS开发——响应链(Responder Chain)的深入理解和代码示例(二)

响应链机制是开发中很重要的概念,在一些事件的处理中需要对响应链的传递有深入的了解,我们才能对事件的传递有更好的控制.今天我们继续来研究下响应链,并实现一个很简单的功能.示例代码已经上传至 https://github.com/chenyufeng1991/HitTest ,可以进行下载调试.要实现的一个很简单的功能就是:透过顶部视图,让底部视图来响应点击事件,这也会响应链使用中非常重要的应用.下面也会涉及一些不同的案例.用到最常用的方法为hitTest:withEvent和pointInside

【IOS笔记】Event Delivery: The Responder Chain

Event Delivery: The Responder Chain  事件分发--响应链 When you design your app, it’s likely that you want to respond to events dynamically. For example, a touch can occur in many different objects onscreen, and you have to decide which object you want to re

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

在iOS 开发中,常见的事件有三种类型,分别是:(1)触摸事件:平常手指在屏幕上滑动,产生的事件都是触摸事件(2)加速计事件:微信的摇一摇就是典型的加速计事件(3)远程控制事件:耳机控制歌曲上一首.下一首.暂停就是远程控制事件的应用.在触摸事件中,通常情况下,点击哪个控件,哪个控件就会产生反应.比如说,点击确定按钮,确定按钮会响应该事件,点击取消按钮,取消按钮会响应该事件.那么,系统是如何决定哪一个视图(控件)来响应该事件呢?当发生触摸事件后,系统会将该事件加入到一个由 UIApplicatio

iOS开发 - 事件传递响应链

一.序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了"单击"这一行为,操作系统把包含这些点击事件的信息包装成UITouch和UIEvent形式的实例,然后找到当前运行的程序,逐级寻找能够响应这个事件的对象,直到没有响应者响应.这一寻找的过程,被称作事件的响应链,如下图所示,不用的响应者以链式的方式寻找. 事件响应链: 二.响应者 在iOS中,能够响应事件的对象都是UIResponder的子类对象.UIRespo

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

首先我们来看看iOS中事件的产生和传递过程: 1.发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的队列事件中 2.UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常会先发送事件给应用程序的主窗口(keyWindow) 3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件 4.找到合适的视图控件后,就会调用视图控件的touches方法来作事件的具体处理:touchesBegin... touchesMoved...touch

iOS - Responder Chain

 在iOS中,当发生事件响应时,必须知道由谁来响应事件.这就是由响应者链来对事件进行响应,所有事件响应的类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获得响应事件消息的机会.当发生事件时,事件首先被发送给第一响应者,第一响应者往往是事件发生的视图,也就是用户触摸屏幕的地方.事件将沿着响应者链一直向下传递,直到被接受并作出处理. 一般来说,第一响应者是个视图对象或者其子类对象,当其被触摸后事件交由他处理,如果他不处理,事件就会被传递给它的视图控制器

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

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

iOS中消息的传递机制(KVO、Notification、delegation、block以及target-action)---转载

注1:本文由破船[博客]译自Communication Patterns. 本文目录如下所示: 可用的机制 做出正确的选择 Framework示例 小结 每个应用程序或多或少,都由一些松耦合的对象构成,这些对象彼此之间要想很好的完成任务,就需要进行消息传递.本文将介绍所有可用的消息传递机制,并通过示例来介绍这些机制在苹果的Framework中如何使用,同时,还介绍了一些最佳实践建议,告诉你什么时机该选择使用什么机制. 虽然这一期的主题是关于Foundation Framework的,不过本文中还