iOS触摸事件总结
一、关于事件传递一些基础知识
1、UIView类是UIResponder的一个子类,因此能够接收用户和视图内容交互 时产生的触摸事件。触摸事件从发生触摸的视图开始,沿着响应者链进行传 递,直到最后被处理。
视图本身就是响应者,是响应者链的参与者,因此可以 收到所有关联子视图派发给它们的触摸事件。
2、在缺省情况下,视图每次只响应一个触摸动作。如果用户将第二个手 指放在屏幕上,系统会忽略该触摸事件,而不会将它报告给视图对象。如果您 希望在视图的事件处理器方法中跟踪多点触摸手势,则需要重新激活多点触摸 事件,具体方法是将视图的multipleTouchEnabled属性声明设置为 YES。 比如标签和图像视图,在初始状态下完全禁止事件处理。您可以通 过改变视图的userInteractionEnabled属性值来控制视图是否可以对事 件进行处理。当某个耗时很长的操作被挂起时,您可以暂时将这个属性设置为 NO
3、在处理触摸事件时,UIKit会通过UIView的hitTest:withEvent:和 pointInside:withEvent:方法来确定触摸事件是否发生在指定的视图 上
二、事件处理
1、事件和触摸
在iPhone OS中,触摸动作是指手指碰到屏幕或在屏幕上移动,它是一个多点 触摸序列的一部分。比如,一个pinch-close手势就包含两个触摸动作:即屏 幕上的两个手指从相反方向靠近对方。一些单指手势则比较简单,比如触击、 双击、或轻拂(即用户快速碰擦屏幕)。应用程序也可以识别更为复杂的手 势,举例来说,如果一个应用程序使用具有转盘形状的定制控件,用户就需要 用多个手指来“转动”转盘,以便进行某种精调。
事件是当用户手指触击屏幕及在屏幕上移动时,系统不断发送给应用程序的对 象。事件对象为一个多点触摸序列中所有触摸动作提供一个快照,其中最重要 的是特定视图中新发生或有变化的触摸动作。一个多点触摸序列从第一个手指 碰到屏幕开始,其它手指随后也可能触碰屏幕,所有手指都可能在屏幕上移 动。当最后一个手指离开屏幕时,序列就结束了。在触摸的每个阶段,应用程 序都会收到事件对象。
触摸信息有时间和空间两方面,时间方面的信息称为阶段(phrase),表示触 摸是否刚刚开始、是否正在移动或处于静止状态,以及何时结束—也就是手指 何时从屏幕举起(参见图3-1)。触摸信息还包括当前在视图或窗口中的位置 信息,以及之前的位置信息(如果有的话)。当一个手指接触屏幕时,触摸就 和某个窗口或视图关联在一起,这个关联在事件的整个生命周期都会得到维 护。如果有多个触摸同时发生,则只有和同一个视图相关联的触摸会被一起处 理。类似地,如果两个触摸事件发生的间隔时间很短,也只有当它们和同一个 视图相关联时,才会被处理为多触击事件。
图3-1 多点触摸序列和触摸阶段
在iPhone OS中,一个UITouch对象表示一个触摸,一个UIEvent对象表示 一个事件。事件对象中包含与当前多点触摸序列相对应的所有触摸对象,还可 以提供与特定视图或窗口相关联的触摸对象(参见图3-2)。在一个触摸序列
发生的过程中,对应于特定手指的触摸对象是持久的,在跟踪手指运动的过程 中,UIKit会对其进行修改。发生改变的触摸属性变量有触摸阶段、触摸在视图 中的位置、发生变化之前的位置、以及时间戳。事件处理代码通过检查这些属 性的值来确定如何响应事件。
图3-2 UIEvent对象及其UITouch对象间的关系
系统可能随时取消多点触摸序列,进行事件处理的应用程序必须做好正确响应 的准备。事件的取消可能是由于重载系统事件引起的,电话呼入就是这样的例 子。
2、事件的传递
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。