IOS 应用处理单个和多个触碰手势分析

作者:朱克锋

邮箱:[email protected]

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


iPhone应用程序中一个很常见的手势是触击:即用户用手指触碰一个对象。响应者对象可以以一种方式响应单击,而以另外一种方式响应双击,甚至可能以第三种方式响应三次触击。您可以通过考察UITouch对象的tapCount属性声明值来确定用户在一个响应者对象上的触击次数,
取得这个值的最好地方是touchesBegan:withEvent:和touchesEnded:withEvent:方法。在很多情况下,我们更倾向于后者,因为它与用户手指离开屏幕的阶段相对应。在触摸结束阶段(UITouchPhaseEnded)考察触击的次数可以确定手指是真的触击,而不是其它动作,比如手指接触屏幕后拖动的动作。
程序清单展示了如何检测某个视图上是否发生双击。
 
- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
       
{
       
    UITouch       *touch = [touches anyObject];
       
    if ([touch tapCount] == 2) {
       
        CGPoint tapPoint = [theTouch locationInView:self];
       
        // Process a double-tap gesture
       
    }
       
}
    
当一个响应者对象希望以不同的方式响应单击和双击事件时,就会出现复杂的情况。举例来说,单击的结果可能是选定一个对象,而双击则可能是显示一个编辑视图,用于编辑被双击的对象。那么,响应者对象如何知道一个单击不是另一个双击的起始部分呢?我们接下来解释响应者对象如何借助上文刚刚描述的事件处理方法来处理这种情况:

    1.    在touchesEnded:withEvent:方法中,当触击次数为一时,响应者对象就向自身发送一个performSelector:withObject:afterDelay:消息,其中的选择器标识由响应者对象实现的、用于处理单击手势的方法;第二个参数是一个NSValue或NSDictionary对象,用于保存相关的UITouch对象;时延参数则表示单击和双击手势之间的合理时间间隔。请注意:使用一个NSValue对象或字典来保存触摸对象是因为它们会保持传入的对象。然而,您自己在进行事件处理时,不应该对UITouch对象进行保持。
 

  2.    在touchesBegan:withEvent:方法中,如果触击次数为二,响应者对象会向自身发送一个cancelPreviousPerformRequestsWithTarget:消息,取消当前被挂起和延期执行的调用。如果触碰次数不为二,则在指定的延时之后,先前步骤中由选择器标识的方法就会被调用,以处理单击手势。

    3.    在touchesEnded:withEvent:方法中,如果触碰次数为二,响应者会执行处理双击手势的代码。




你可能感兴趣的:(ios)