iphone开发之事件处理

上传人:平*** 文档编号:16538520 上传时间:2017-11-08 格式:DOC 页数:19 大小:633.24KB
返回 下载 相关 举报
iphone开发之事件处理_第1页
第1页 / 共19页
iphone开发之事件处理_第2页
第2页 / 共19页
iphone开发之事件处理_第3页
第3页 / 共19页
iphone开发之事件处理_第4页
第4页 / 共19页
iphone开发之事件处理_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《iphone开发之事件处理》由会员分享,可在线阅读,更多相关《iphone开发之事件处理(19页珍藏版)》请在金锄头文库上搜索。

1、事件处理本章将描述 iPhone OS 系统中的事件类型,并解 释如何处理这些事件。文中 还将讨论如何在应用程序内部或不同应用程序间通过 UIPasteboard类提供的设施进行数据的拷贝和粘贴, 该类是 iPhone OS 3.0 引入的。iPhone OS 支持两种 类型的事件:即触摸事件或运动事件。在 iPhone OS 3.0 中,UIEvent 类已经被扩展为不仅可以包含触摸事件和运动事件,还可以容纳将来可能引入的其它事件类型。每个事件都有一个与之关联的事件类型和子类型,可以通 过 UIEvent的 type和 subtype属性声明进行访问,类型既包括触摸事件,也包括运动 事件。在

2、 iPhone OS 3.0 上,子类型只有一种,即 摇摆-运动子类型(UIEventSubtypeMotionShake)。触摸事件iPhone OS 中的触摸事件基于多点触摸模型。用 户不是通过鼠标和键盘,而是通 过触摸设备的屏幕来操作对象、输 入数据、以及指示自己的意图。iPhone OS 将一个或多个和屏幕接触的手指识别为多点触摸序列的一部分,该 序列从第一个手指碰到屏幕开始,直到最后一个手指离开屏幕结束。iPhone OS 通过一个多点触摸序列来跟踪与屏幕接触的手指,记录 每个手指的触摸特征,包括手指在屏幕上的位置和发生触摸的时间。应用程序通常将特定组合的触摸识别为手势,并以用户直觉

3、的方式来进行响应,比如 对收缩双指距离的手势,程序的响应是缩小显示的内容;对轻拂屏幕的手势,则响应为滚动显示内容。请注意:手指在屏幕上能达到的精度和鼠标指针有很大的不同。当用户触击屏幕时,接触区域 实际上是椭圆形的,而且比用户 想像的位置更靠下一点。根据触摸屏幕的手指、手指的尺寸、手指接触屏幕的力量、手指的方向、以及其它因素的不同,其“接触部位”的尺寸和形状也有所不同。底 层的多点触摸系统会分析所有的这些信息,为您计 算出单一的触点。很多 UIKit 类对多点触摸事件的处 理方式不同于它的对象实例,特别是像 UIButton和 UISlider这样的 UIControl的子类。这些子类的对象

4、被称为控件对象只接收特定类型的手势,比如触 击或向特定方向拖拽。控件对象在正确配置之后,会在某种手势发生后将动作消息 发送给目标对象。其它的 UIKit 类则在其它的上下文中处理手势,比如 UIScrollView可以为表格视图和具有很大内容区域的文本视图提供滚动行为。某些应用程序可能不需要直接处理事件,它们可以依赖 UIKit 类实现的行为。但是,如果您创建了 UIView的 定制子类 这是 iPhone OS 系统开发的常见模式且希望该视图响应特定的触摸事件,就需要实现处理该事件所需要的代码。而且,如果您希望一个 UIKit 对象以不同的方式响应事件,就必须创建框架类的子类,并重载相应的事

5、件处理方法。事件和触摸在 iPhone OS 中,触摸动作是指手指碰到屏幕或在屏幕上移动,它是一个 多点触摸序列的一部分。比如,一个 pinch-close 手势就包含两个触摸 动作:即屏幕上的两个手指从相反方向靠近对方。一些单指手势则比较简单,比如触击、双击、或轻拂(即用户快速碰擦屏幕)。 应用程序也可以 识别更为复杂的手势, 举例来说,如果一个应用程序使用具有转盘形状的定制控件,用 户就需要用多个手指来“转动” 转盘,以便进行某种精调。事件是当用户手指触击屏幕及在屏幕上移动时,系统不断发送给应用程序的对象。事件 对象为一个多点触摸序列中所有触摸动作提供一个快照,其中最重要的是特定视图中新发

6、生或有变化的触摸动作。一个多点触摸序列从第一个手指碰到屏幕开始,其它手指随后也可能触碰屏幕,所有手指都可能在屏幕上移动。当最后一个手指离开屏幕时,序列就 结 束了。在触摸的每个 阶段,应用程序都会收到事件对象。触摸信息有时间和空间两方面, 时间 方面的信息称为阶段(phrase),表示触摸是否刚刚开始、是否正在移 动或处于静止状态,以及何 时结束 也就是手指何时从屏幕举起(参见图 3-1)。触摸信息还包括当前在视图或窗口中的位置信息,以及之前的位置信息(如果有的话)。当一个手指接触屏幕时,触摸就和某个窗口或视图关联在一起,这个关 联在事件的整个生命周期都会得到 维护。如果有多个触摸同时发生,则

7、只有和同一个视图相关联的触摸会被一起处理。类 似地,如果两个触摸事件 发生的间 隔时间很短,也只有当它们和同一个视图相关联时,才会被 处理为多触击 事件。图 3-1 多点触摸序列和触摸阶段在 iPhone OS 中,一个 UITouch对象表示一个触摸,一个 UIEvent对象表示一个事件。事件 对象中包含与当前多点触摸序列相对应的所有触摸对象,还可以提供与特定视图或窗口相关联的触摸对象(参见图3-2)。在一个触摸序列发生的过程中,对应于特定手指的触摸对象是持久的,在跟踪手指运动的过程中,UIKit 会对其进行修改。发生改变的触摸 属性变量有触摸阶段、触摸在视图中的位置、 发生变化之前的位置、

8、以及时间戳。事件 处理代码通过检查这 些属性的值来确定如何响应事件。图 3-2 UIEvent对象及其 UITouch对象间的关系系统可能随时取消多点触摸序列, 进行事件处理的应用程序必须做好正确响应的准备。事件的取消可能是由于重载系统事件引起的, 电话呼入就是 这样的例子。事件的传递系统将事件按照特定的路径传递给可以对其进行处理的对象。如 “核心应用程序架构” 部分描述的那样,当用户触摸设备屏幕时,iPhone OS 会将它识别为一组触摸对象,并将它 们封装在一个 UIEvent对象中,放入当前应用程序的事件队列中。事件对象将特定时刻的多点触摸序列封装为一些触摸对象。 负责管理应用程序的 U

9、IApplication单件对象将事件从队列的顶部取出,然后派发给其它对象进行处理。典型情况下,它会将事件发 送给应用程序的 键盘焦点窗口即拥有当前用户事件焦点的窗口,然后代表 该窗口的UIWindow对象再将它 发送给第一响应者进行处理(第一响应者在 “响应者对象和响应者链”部分中描述)。应用程序通过触碰测试(hit-testing )来寻找事件的第一响应者,即通过递归调用视图层次中视图对象的hitTest:withEvent:方法来确认发生触摸的子视图。触摸 对象的整个生命周期都和该视图互相关联,即使触摸动作最终移动到该视图区域之外也是如此。 “事件处理技巧” 部分对触碰测试在编程方面的一

10、些隐含意义进行讨论。UIApplication对象和每个 UIWindow对象都在 sendEvent:方法(两个类都声明了这个方法)中派发事件。由于这 些方法是事件进 入应用程序的通道,所以,您可以从 UIApplication或 UIWindow派生出子类,重载 其 sendEvent:方法,实现对事件的监控或执行特殊的事件处理。但是,大多数应用程序都不需要这样做。响应者对象和响应者链响应者对象是可以响应事件并对其进行处理的对象。UIResponder 是所有响应者对象的基类,它不仅为事件处理,而且也 为常见的响应者行 为定义编程接口。 UIApplication、UIView、和所有从

11、UIView派生出来的 UIKit 类(包括 UIWindow)都直接或间接地继承自 UIResponder类。第一响应者是应用程序中当前负责接收触摸事件的响应者对象(通常是一个 UIView对象)。UIWindow对象以消息的形式将事件发送给第一响应者,使其有机会首先 处理事件。如果第一响应者没有进行处理,系统就将事件(通过消息)传递给响应者链中的下一个响应者,看看它是否可以进行处理。响应者链是一系列链接在一起的响应者对象,它允许响应者对象将处理事件的责任传递给其它更高级别的对象。随着应用程序 寻找能够处理事件的 对象,事件就在响 应者链中向上 传递。响应者链由一系列“下一个响应者” 组 成

12、,其顺序如下:1. 第一响应者将事件传递给它的视图控制器(如果有的话),然后是它的父视图。2. 类似地, 视图层 次中的每个后 续视图都首先传递给它的视图控制器(如果有的话),然后是它的父视图。3. 最上层的容器视图将事件传递给 UIWindow对象。4. UIWindow对象将事件传递给 UIApplication单件对象。如果应用程序找不到能够处理事件的响应者对象,则丢弃该事件。响应者链中的所有响应者对象都可以实现 UIResponder的某个事件处理方法,因此也都可以接收事件消息。但是,它们可能不愿处理或只是部分处理某些事件。如果是那样的话,它 们可以将事件消息转送给下一个响应者,方法大

13、致如下:- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event UITouch* touch = touches anyObject;NSUInteger numTaps = touch tapCount;if (numTaps = HORIZ_SWIPE_DRAG_MIN &fabsf(startTouchPosition.y - currentTouchPosition.y) = VERT_SWIPE_DRAG_MAX)/ It appears to be a swipe.if (startTouchPosition

14、.x currentTouchPosition.x)self myProcessRightSwipe:touches withEvent:event;elseself myProcessLeftSwipe:touches withEvent:event;else/ Process a non-swipe event.处理复杂的多点触摸序列触击和碰擦是简单的手势。如何处 理更为复杂的多点触摸序列实际上是解析应用程序特有的手势取决于应用程序希望完成的具体目标。您可以跟踪所有 阶段的所有触摸动作, 记录触摸对象中发生变化的属性变量,并正确地改 变内部的状态。说明如何处理复杂的多点触摸序列的最好方法是

15、通过实例。程序清单 3-3 展示一个定制的 UIView对象如何通过在屏幕上动画移动“Welcome”标语牌来响应用户手指的移动,以及如何通 过改变欢迎标语的语言来响应用户的双击手势(例子中的代码来自一个名为 MoveMe 的示例工程,进一步考察该工程可以更好地理解事件处理的上下文)。程序清单 3-3 处理复杂的多点触摸序列- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)eventUITouch *touch = event allTouches anyObject;/ Only move the placard view

16、if the touch was in the placard viewif (touch view != placardView) / On double tap outside placard view, update placards display stringif (touch tapCount = 2) placardView setupNextDisplayString;return;/ Pulse the placard view by scaling up then down/ Use UIViews built-in animationUIView beginAnimations:nil context:NULL;UIView setAnimationDuration:0.5;CGAffineTransform transform = CGAffineTransformMakeScale(1.2, 1.2);placard

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号