IOS 应用事件处理方法分析

来源:互联网 发布:2015年中国经济数据 编辑:程序博客网 时间:2024/06/06 17:37

作者:朱克锋

邮箱:zhukefeng@iboxpay.com

转载请注明出处:http://blog.csdn.net/linux_zkf


在一个多点触摸序列发生的过程中,应用程序会发出一系列事件消息。为了接收和处理这些消息,响应者对象的类必须至少实现下面这些由UIResponder类声明的方法之一:
 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
       
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
       
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
       
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
    
在给定的触摸阶段中,如果发生新的触摸动作或已有的触摸动作发生变化,应用程序就会发送这些消息:
    ▪当一个或多个手指触碰屏幕时,发送touchesBegan:withEvent:消息。
    ▪当一个或多个手指在屏幕上移动时,发送touchesMoved:withEvent:消息。
    ▪当一个或多个手指离开屏幕时,发送touchesEnded:withEvent:消息。
    ▪当触摸序列被诸如电话呼入这样的系统事件所取消时,发送touchesCancelled:withEvent:消息。
上面这些方法都和特定的触摸阶段(比如UITouchPhaseBegan)相关联,该信息存在于UITouch对象的phase属性声明中。
每个与事件处理方法相关联的消息都有两个参数。第一个参数是一个UITouch对象的集合,表示给定阶段中新的或者发生变化的触摸动作;第二个参数是一个UIEvent对象,表示这个特定的事件。您可以通过这个事件对象得到与之相关联的所有触摸对象(allTouches),或者发生在特定的视图或窗口上的触摸对象子集。其中的某些触摸对象表示自上次事件消息以来没有发生变化,或虽然发生变化但处于不同阶段的触摸动作。
为了处理给定阶段的事件,响应者对象常常从传入的集合参数中取得一或多个UITouch对象,然后考察这些对象的属性或取得它们的位置(如果需要处理所有触摸对象,可以向该NSSet对象发送anyObject消息)。UITouch类中有一个名为locationInView:的重要方法,如果传入self参数值,它会给出触摸动作在响应者坐标系统中的位置(假定该响应者是一个UIView对象,且传入的视图参数不为nil)。另外,还有一个与之平行的方法,可以给出触摸动作之前位置(previousLocationInView:)。UITouch实例的属性还可以给出发生多少次触碰(tapCount)、触摸对象的创建或最后一次变化发生在什么时间(timestamp)、以及触摸处于什么阶段(phase)。
响应者类并不是必须实现上面列出的所有三个事件方法。举例来说,如果它只对手指离开屏幕感兴趣,则只需要实现touchesEnded:withEvent:方法就可以了。

在一个多点触摸序列中,如果响应者在处理事件时创建了某些持久对象,则应该实现touchesCancelled:withEvent:方法,以便当系统取消该序列的时候对其进行清理。多点触摸序列的取消常常发生在应用程序的事件处理遭到外部事件—比如电话呼入—破坏的时候。



原创粉丝点击