直接在touche事件里面判断双击和单击手势

如果直接判断 if (touch.tapCount == 1)立即调用某个方法的话,会出现出乎意料的情况,不过今天看到苹果的iPhone应用开发指南里面,清楚的描述了如何解决这个问题。



程序清单3-1  检测双击手势

- (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:消息,其中的选择器标识由响应者对象实现的、用于处理单击手势的方法;第二个参数是一个NSValueNSDictionary对象,用于保存相关的UITouch对象;时延参数则表示单击和双击手势之间的合理时间间隔。

    请注意:使用一个NSValue对象或字典来保存触摸对象是因为它们会保持传入的对象。然而,您自己在进行事件处理时,不应该对UITouch对象进行保持。

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

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

posted @ 2012-03-11 17:15  dcty  阅读(828)  评论(0编辑  收藏  举报