处理单个和多个触碰手势
处理单个和多个触碰手势
iPhone应用程序中一个很常见的手势是触击:即用户用手指触碰一个对象。响应者对象可以以一种方式响应单击,而以另外一种方式响应双击,甚至可能以第三种方式响应三次触击。您可以通过考察UITouch
对象的tapCount
属性声明值来确定用户在一个响应者对象上的触击次数,
取得这个值的最好地方是touchesBegan:withEvent:
和touchesEnded:withEvent:
方法。在很多情况下,我们更倾向于后者,因为它与用户手指离开屏幕的阶段相对应。在触摸结束阶段(UITouchPhaseEnded
)考察触击的次数可以确定手指是真的触击,而不是其它动作,比如手指接触屏幕后拖动的动作。
程序清单3-1展示了如何检测某个视图上是否发生双击。
程序清单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:
方法中,如果触碰次数为二,响应者会执行处理双击手势的代码。如果 iPhone 应用里有个 view,既有单击操作又有双击操作。用户双击 view 时,总是先执行一遍单击的操作再执行双击的操作。所以直接判断时就会发现不能直接进入双击操作。下面是区分 touch 事件是单击还是双击的方法
-(void)singleTap{
NSLog(@"Tap 1 time");
}
-(void)doubleTap{
NSLog(@"Tap 2 time");
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
NSTimeInterval delaytime = 0.4;//自己根据需要调整
switch (touch.tapCount) {
case 1:
[self performSelector:@selector(singleTap) withObject:nil afterDelay:delaytime];
break;
case 2:{
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTap) object:nil];
[self performSelector:@selector(doubleTap) withObject:nil afterDelay:delaytime];
}
break;
default:
break;
}
}