一、事件分类
对于IOS设备用户来说,他们操作设备的方式主要有三种:触摸屏幕、晃动设备、通过遥控设施控制设备。对应的事件类型有以下三种:
1、触屏事件(Touch Event)
2、运动事件(Motion Event)
3、远端控制事件(Remote-Control Event)
今天以触屏事件(Touch Event)为例,来说明在Cocoa Touch框架中,事件的处理流程。首先不得不先介绍响应者链这个概念:
二、响应者链(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)。
图二
加入用户点击了View E,下面结合图二介绍hit-test view的流程:
1、A是UIWindow的根视图,因此,UIWindwo对象会首相对A进行hit-test;
2、显然用户点击的范围是在A的范围内,因此,pointInside:withEvent:返回了YES,这时会继续检查A的子视图;
3、这时候会有两个分支,B和C:
点击的范围不再B内,因此B分支的pointInside:withEvent:返回NO,对应的hitTest:withEvent:返回nil;
点击的范围在C内,即C的pointInside:withEvent:返回YES;
4、这时候有D和E两个分支:
点击的范围不再D内,因此D的pointInside:withEvent:返回NO,对应的hitTest:withEvent:返回nil;
点击的范围在E内,即E的pointInside:withEvent:返回YES,由于E没有子视图(也可以理解成对E的子视图进行hit-test时返回了nil),因此,E的hitTest:withEvent:会将E返回,再往回回溯,就是C的hitTest:withEvent:返回E--->>A的hitTest:withEvent:返回E。
至此,本次点击事件的第一响应者就通过响应者链的事件分发逻辑成功的找到了。
不难看出,这个处理流程有点类似二分搜索的思想,这样能以最快的速度,最精确地定位出能响应触摸事件的UIView。
三、说明
1、如果最终hit-test没有找到第一响应者,或者第一响应者没有处理该事件,则该事件会沿着响应者链向上回溯,如果UIWindow实例和UIApplication实例都不能处理该事件,则该事件会被丢弃;
2、 hitTest:withEvent:方法将会忽略隐藏(hidden=YES)的视图,禁止用户操作 (userInteractionEnabled=YES)的视图,以及alpha级别小于0.01(alpha<0.01)的视图。如果一个子视 图的区域超过父视图的bound区域(父视图的clipsToBounds 属性为NO,这样超过父视图bound区域的子视图内容也会显示),那么正常情况下对子视图在父视图之外区域的触摸操作不会被识别,因为父视图的 pointInside:withEvent:方法会返回NO,这样就不会继续向下遍历子视图了。当然,也可以重写 pointInside:withEvent:方法来处理这种情况。
3、我们可以重写hitTest:withEvent:来达到某些特定的目的,下面的链接就是一个有趣的应用举例,当然实际应用中很少用到这些。
http://download.csdn.net/detail/wzzvictory_tjsd/5716299
参考文档:
https://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/event_delivery_responder_chain/event_delivery_responder_chain.html#//apple_ref/doc/uid/TP40009541-CH4-SW1
相关推荐
UIKit框架则是Cocoa Touch的核心,专注于图形用户界面和事件处理。UIKit包含了如UIApplication、UIWindow和UIView等关键类,它们构成了iOS应用的响应者链。当用户与屏幕交互时,UIKit会生成事件并沿着响应者链传递,...
Swift是一种现代化的、高性能的语言,而Objective-C则是更早的、苹果传统的语言,两者都能与Cocoa Touch框架无缝集成,这是iOS开发的核心部分。 在iOS开发中,我们通常会用到Xcode,这是一个强大的集成开发环境...
iOS应用通常基于Cocoa Touch框架,它包括Objective-C或Swift语言,以及UIKit库,用于创建用户界面。在这个源码包中,你可能会找到如何创建视图(UIView)、控制器(UIViewController)和交互元素(如按钮、标签、...
8. **事件处理和通知**:学习如何响应设备方向变化、运动状态更新等事件。 9. **性能优化**:如何高效地处理大量传感器数据,减少能源消耗。 10. **测试与调试**:了解如何进行单元测试、模拟器测试和真机测试,确保...
2. **Cocoa Touch**:这是iOS应用开发的核心框架,包含了UI元素(如按钮、文本视图、图像视图等)和事件处理机制。通过学习OpenShooter的代码,你可以了解到如何创建用户界面,响应用户交互,以及实现动画效果。 3....
- 如何实现触摸事件处理,以响应用户的操作。 - 如何进行图形渲染,创建流畅的动画效果。 - 如何使用AVFoundation播放音频,营造游戏氛围。 - 如何进行内存管理和性能优化。 - 如何进行单元测试和集成测试,确保代码...
在iOS中,事件模型基于Cocoa Touch框架,其主要由三个组件构成:事件(Events)、事件响应者链(Event Responder Chain)和手势识别器(Gesture Recognizers)。 1. **事件**:iOS中的事件分为不同类型,例如触摸...
Cocoa Touch是iOS应用程序的基础框架,它包括UIKit,负责UI组件的创建和事件处理,以及其他支持媒体、网络、位置服务等功能的框架。通过Cocoa Touch,开发者可以创建出响应触摸操作的交互式界面。 完成这个指南后,...
在iOS开发中,消息响应是理解应用程序内部工作原理的关键部分。这个"iOS消息响应demo"很可能是为了演示如何在Objective-C或Swift中处理用户交互和事件。在这个项目中,我们可能会看到一个简单的应用,它展示了从用户...
- 游戏可能基于Cocoa Touch框架,它是iOS应用开发的基础,提供了UI控件和事件处理机制。 2. **编程语言**: - 本项目可能使用Objective-C或Swift,两者都是iOS开发的官方语言。Objective-C是早期的首选,具有面向...
3. **Cocoa Touch(iOS)与Cocoa(Mac)**:Cocoa Touch是iOS开发的框架集合,包括UIKit等,提供UI控件、事件处理、动画等功能。Cocoa则是Mac OS X的开发框架,包含AppKit等子框架。两者都基于Objective-C,并且提供...
3. **Cocoa Touch框架**:这是iOS应用程序的用户界面构建块,包括UIKit、Foundation等组件。学习如何使用UIViewController、UIView、UIButton、UILabel等控件创建交互式UI是实例中的重点。 4. **Model-View-...
涵盖面试中可能遇到的技术问题、iOS开发流程、测试进程、CocoaPods、iCloud、HealthKit、HomeKit、Apple Pay、iOS应用沙盒机制、VoiceOver、辅助功能、后台多任务处理、Game Center、iBeacons、Cocoa/Cocoa Touch、...
Cocoa Touch是iOS应用程序的基础,它包含了一系列用于创建用户界面和处理用户交互的类。 在Objective-C方面,你需要掌握类、对象、消息传递等基本概念。Objective-C是iOS开发的传统语言,它基于C语言并添加了面向...
iOS应用程序主要基于Cocoa Touch框架构建,该框架提供了一系列触摸事件处理机制。事件处理流程通常如下: - **事件生成**:当用户触摸屏幕时,系统会生成一个UIEvent对象。 - **事件分发**:事件由UIApplication...
《iOS学徒3 - 我的位置(MyLocations)》是一本专为初学者设计的iOS开发教程,主要使用Objective-C语言进行编写,同时也涉及到Swift的相关知识。这本书深入浅出地介绍了如何构建一个地理位置应用,帮助读者从零基础...
此外,事件处理和响应链也是iOS开发中的核心概念。事件如触摸输入、用户交互等,需要通过代理模式或者Block进行处理。观察者模式也可能用于监听状态变化并做出相应操作。在这个项目中,我们有机会看到这些模式的实际...
首先,Cocoa Touch是Apple为iOS设备开发应用程序的主要框架,它包括了用户界面组件、事件处理机制以及多媒体支持等多个方面。书中会详细介绍Cocoa Touch的基石,如UIKit,它是构建iOS应用界面的主要工具包,包含各种...