`

iOS 层级关系和响应者链剖析

阅读更多

一、事件分类

对于IOS设备用户来说,他们操作设备的方式主要有三种:触摸屏幕、晃动设备、通过遥控设施控制设备。对应的事件类型有以下三种:

1、触屏事件(Touch Event)

2、运动事件(Motion Event)

3、远端控制事件(Remote-Control Event)

今天以触屏事件(Touch Event)为例,来说明在Cocoa Touch框架中,事件的处理流程。首先不得不先介绍响应者链这个概念:

 

file:///Users/meq/Desktop/屏幕快照%202016-06-03%20上午11.57.34.png

二、响应者链(Responder Chain)

先来说说响应者对象(Responder Object),有响应和处理事件能力的对象。

响应者链就是由一系列的响应者对象构成的一个层次结构。

 

UIResponder是所有响应对象的基类,在UIResponder类中定义了处理上述各种事件的接口。我们熟悉的UIApplication、 UIViewController、UIWindow和所有继承自UIView的UIKit类都直接或间接的继承自UIResponder,所以它们的实例都是可以构成响应者链的响应者对象。图一展示了响应者链的基本构成:

 

 

从图一中可以看到,响应者链有以下特点:

1、响应者链通常是由视图(UIView)构成的;

2、一个视图的下一个响应者是它视图控制器(UIViewController)(如果有的话),然后再转给它的父视图(Super View);

3、视图控制器(如果有的话)的下一个响应者为其管理的视图的父视图;

4、单例的窗口(UIWindow)的内容视图将指向窗口本身作为它的下一个响应者

需要指出的是,Cocoa Touch应用不像Cocoa应用,它只有一个UIWindow对象,因此整个响应者链要简单一点;

 

5、单例的应用(UIApplication)是一个响应者链的终点,它的下一个响应者指向nil,以结束整个循环。

三、事件分发(Event Delivery)

第一响应者(First responder)指的是当前接受触摸的响应者对象(通常是一个UIView对象),即表示当前该对象正在与用户交互,它是响应者链的开端。整个响应者链和事件分发的使命都是找出第一响应者。

UIWindow对象以消息的形式将事件发送给第一响应者,使其有机会首先处理事件。如果第一响应者没有进行处理,系统就将事件(通过消息)传递给响应者链中的下一个响应者,看看它是否可以进行处理。

iOS系统检测到手指触摸(Touch)操作时会将其打包成一个UIEvent对象,并放入当前活动Application的事件队列,单例的UIApplication会从事件队列中取出触摸事件并传递给单例的UIWindow来处理,UIWindow对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图,这个过程称之为hit-test view。

 

UIWindow实例对象会首先在它的内容视图上调用hitTest:withEvent:,此方法会在其视图层级结构中的每个视图上调用pointInside:withEvent:(该方法用来判断点击事件发生的位置是否处于当前视图范围内,以确定用户是不是点击了当前视图),如果pointInside:withEvent:返回YES,则继续逐级调用,直到找到touch操作发生的位置,这个视图也就是要找的hit-test view。
hitTest:withEvent:方法的处理流程如下:
首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内;
若返回NO,则hitTest:withEvent:返回nil;
若返回YES,则向当前视图的所有子视图(subviews)发送hitTest:withEvent:消息,所有子视图的遍历顺序是从最顶层视图一直到到最底层视图,即从subviews数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕;
若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束;
如所有子视图都返回非,则hitTest:withEvent:方法返回自身(self)。

 

  • 大小: 45.2 KB
  • 大小: 93.1 KB
分享到:
评论

相关推荐

    IOS应用源码Demo-适用于iPad的多层级的侧边栏菜单-毕设学习.zip

    因此,这个源码可能包含了一整套的iOS应用开发流程,对于初学者来说,是一个很好的学习资源,可以了解到实际项目中如何组织代码、实现功能和优化用户体验。 从标签来看,“IOS 毕业设计 论文 源码 App”,我们可以...

    IOS应用源码——一个简单的层管理.zip

    了解如何利用响应者链能帮助你更好地理解和处理用户输入。 9. **Category与Extension**:在提供的源码中,可能包含了对`UIView`的分类(Category)或扩展(Extension),以增加`UIView`的功能或定制行为。 通过...

    ios开发Puff游戏源码

    在iOS应用开发领域,游戏开发一直是一个热门话题,尤其对于初学者和经验丰富的开发者来说,通过分析和学习游戏源码,能够快速提升自己的技能。本篇文章将重点围绕“ios开发Puff游戏源码”这一主题,深入探讨如何在...

    IOS5 GUI界面psd文件

    8. **响应式设计**:虽然iOS 5主要针对iPhone 4S,但理解其设计原则可以帮助你适应不同屏幕尺寸的设备,因为苹果的设计哲学在后来的版本中依然沿用。 通过深入研究这份【iOS 5 GUI界面psd文件】,设计师不仅可以...

    Beginning iOS 5 Development Exploring the iOS SDK

    《开始iOS 5开发:探索iOS SDK》是一本全面而实用的指南,适合初学者入门iOS应用程序开发。通过循序渐进地学习本书中的每一个章节,读者将能够掌握iOS开发的基础知识,并逐步建立起自己的iOS应用程序。无论是对于...

    ios应用源码之用于ipad的自定义侧边栏导航效果 2018128

    在iOS应用开发中,侧边栏导航是一种常见的交互设计,尤其在iPad应用中,它可以提供一个高效的多层级菜单展示方式...通过学习和分析提供的源码,开发者不仅可以了解到具体的实现细节,还能进一步提升自己的iOS开发能力。

    ios开发资料

    本资源“ios开发资料”聚焦于这一功能的实现,特别适合初学者进行学习和实践。下面我们将深入探讨如何在iOS应用中实现下拉列表功能。 首先,下拉列表在iOS开发中通常被称为PickerView或TableView。在iOS的UIKit框架...

    IOS应用源码之iphone放大镜效果(放大镜保持在最上层,盖住StatusBar) SimplerMaskTest.zip

    5. **响应者链(Responder Chain)**:放大镜功能需要处理用户的触摸事件,这涉及到iOS的响应者链机制。开发者可能需要确保放大镜视图能够接收到并处理这些事件,同时不影响其他视图的正常交互。 6. **自动布局...

    iOS 应用开发学习指南

    - 分析将桌面应用程序移植到iOS平台的过程和技术挑战。 - 示例代码和实际操作步骤,帮助理解整个过程。 #### 六、商业化策略 - **成本估算**: - 创建一个应用的成本因项目规模、团队规模等因素而异。 - 通常...

    iOS面试及答案 @MLGJ

    理解如何创建视图层级、响应用户交互、布局管理(如AutoLayout和Size Classes)以及实现手势识别是必备技能。 3. **内存管理**:iOS使用ARC(Automatic Reference Counting)自动引用计数管理内存,但开发者仍需...

    Beginning iOS 4 Application Development

    - 讲解视图控制器的作用和用法,包括如何管理视图层级、响应事件等。 - **第5章:iPhone与iPad多平台支持** - 分析了在iOS 4中为不同设备开发统一应用的方法,重点介绍适配不同屏幕尺寸的技术。 - **第6章:键盘...

    IOS自定义UIActionSheet的Demo

    5. **响应链(Delegate)**:设置代理协议,当用户点击某个按钮时,通过代理方法通知调用者执行相应的操作。 6. **布局管理**:可以使用AutoLayout或者Size Class来处理不同屏幕尺寸下的适配问题,确保ActionSheet...

    100家企业iOS面试题(下)

    - ** Bugly**:腾讯Bugly是一款移动应用崩溃收集和分析服务,能够帮助开发者快速定位和修复应用中的崩溃问题。 - **崩溃收集**:通过使用Bugly,开发者可以收集到详细的崩溃报告,以便更好地理解和解决应用中的...

    iPhone UIKit详解源代码

    2. 响应者链:了解事件处理机制,包括触摸事件、手势识别,以及如何通过 responder chain 实现事件的传递。 3. 动画与过渡:学习如何使用CAAnimation和UIView动画来创建平滑的过渡效果,增强用户体验。 4. 自定义...

    RoundDisk幸运大转盘旋转游戏_ios源码

    通过分析并实践这个源码,开发者可以深入理解iOS应用的生命周期、视图层级结构、动画实现、用户输入处理以及游戏逻辑设计等多个方面,进一步提升iOS开发技能。同时,此项目也可以作为教学案例,帮助初学者快速掌握...

    iOS游戏应用源代码——acastr7-iPhone-Mario-Game-bd5c6ea.zip

    在这个马里奥游戏中,我们可能会看到如何利用UIView和UIViewController来构建游戏场景,以及如何使用UIResponder链来响应用户的触摸事件。 3. **游戏物理引擎**:为了实现马里奥游戏中的跳跃、碰撞检测和平台运动等...

    ios应用源码之类似苹果内置谷歌地图的翻页效果 2018128

    6. **响应式设计**:为了确保在不同尺寸的iOS设备上都能正确显示,开发者需要考虑响应式布局和Auto Layout。 7. **性能优化**:在处理大型地图图像或复杂动画时,性能优化是必不可少的,可能涉及到内存管理、离屏...

    iOS笔试相关

    在iOS的面试与笔试环节,求职者通常会面临一系列关于Objective-C、Swift编程语言、UIKit框架、内存管理、多线程、网络编程、设计模式、性能优化等方面的问题。以下是一些核心知识点的详细阐述,旨在为准备iOS面试的...

    IOS应用源码Demo-超炫的电子书书架管理工具应用-毕设学习.zip

    通过分析这个项目,我们可以掌握一系列iOS开发中的核心知识点,包括界面设计、数据管理、用户交互以及性能优化等方面。 首先,我们需要了解iOS应用的基础架构,通常基于Apple的Swift或Objective-C编程语言。此项目...

    ios-两表联动.zip

    6. **响应式编程**:Swift的 Combine 框架也可以用于处理这种事件驱动的联动,通过发布者(Publisher)和订阅者(Subscriber)进行数据流的管理。 在"JG2Table_Swift"这个文件中,很可能包含了实现这些步骤的源代码...

Global site tag (gtag.js) - Google Analytics