如果直接判断 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 |
} |
} |
当一个响应者对象希望以不同的方式响应单击和双击事件时,就会出现复杂的情况。举例来说,单击的结果可能是选定一个对象,而双击则可能是显示一个编辑视图,用于编辑被双击的对象。那么,响应者对象如何知道一个单击不是另一个双击的起始部分呢?我们接下来解释响应者对象如何借助上文刚刚描述的事件处理方法来处理这种情况:
-
在
touchesEnded:withEvent:
方法中,当触击次数为一时,响应者对象就向自身发送一个performSelector:withObject:afterDelay:
消息,其中的选择器标识由响应者对象实现的、用于处理单击手势的方法;第二个参数是一个NSValue
或NSDictionary
对象,用于保存相关的UITouch
对象;时延参数则表示单击和双击手势之间的合理时间间隔。 -
在
touchesBegan:withEvent:
方法中,如果触击次数为二,响应者对象会向自身发送一个cancelPreviousPerformRequestsWithTarget:
消息,取消当前被挂起和延期执行的调用。如果触碰次数不为二,则在指定的延时之后,先前步骤中由选择器标识的方法就会被调用,以处理单击手势。 -
在
touchesEnded:withEvent:
方法中,如果触碰次数为二,响应者会执行处理双击手势的代码。