在iPhone OS上,两次点击被认为是双击的时间限制是什么?
//编辑:为什么这很重要?
为了以不同的方式处理单击和双击,Apple的指南说要在第一次点击时以{合理'的间隔执行performSelector...afterDelay
(如果检测到第二次点击,则稍后取消)。
问题是如果间隔太短(0.1),即使双击(如果仅依赖于tapCount,也会)执行单击操作。如果它太长(0.8),当没有可能进行双击时,用户将不必要地等待识别单击。
必须正好正确的数字,以便最佳地工作,但绝对不能更小,或者有机会出现错误(同时单击和双击)。
答案 0 :(得分:11)
您可以通过点击手势检测任意数量的点按。无需使用NSTouches
。对于在这里寻求解决方案的所有用户来说都是。
这些简单的代码行负责单击和双击功能。
UITapGestureRecognizer *doubleTapRecg = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(doubleTapped:)];
doubleTapRecg.delegate = self;
doubleTapRecg.numberOfTapsRequired = 2;
doubleTapRecg.numberOfTouchesRequired = 1;
[view addGestureRecognizer:doubleTapRecg];
UITapGestureRecognizer *tapRecg = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(tapped:)];
tapRecg.delegate = self;
tapRecg.numberOfTapsRequired = 1;
tapRecg.numberOfTouchesRequired = 1;
[view addGestureRecognizer:tapRecg];
[tapRecg requireGestureRecognizerToFail:doubleTapRecg];
[doubleTapRecg release];
[tapRecg release];
答案 1 :(得分:10)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
NSUInteger tapCount = [touch tapCount];
switch (tapCount) {
case 1:
[self performSelector:@selector(singleTapMethod) withObject:nil afterDelay:.4];
break;
case 2:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTapMethod) object:nil];
[self performSelector:@selector(doubleTapMethod) withObject:nil afterDelay:.4];
break;
case 3:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(doubleTapMethod) object:nil];
[self performSelector:@selector(tripleTapMethod) withObject:nil afterDelay:.4];
break;
case 4:
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(tripleTapMethod) object:nil];
[self quadrupleTap];
break;
default:
break;
}
}
@end
对我来说这个代码工作得很好.... :)最后的帖子是在8月15日左右.... 但我正在经历同样的问题,所以想分享我找到的解决方案......
答案 2 :(得分:8)
在Apple提供的iPhone Application Programming Guide: Event Handling示例中(意大利用户提及),使用了0.3
的延迟:
[self performSelector:@selector(handleSingleTap:) withObject:touchLoc afterDelay:0.3];
答案 3 :(得分:5)
在developer.apple.com上的开发者论坛上,Apple开发人员说:
我已将此作为bug 68405提交给Apple。
答案 4 :(得分:1)
我不相信有一个默认的时间限制 - 当你试用它时,它是什么“感觉”正确。 Apple有一个示例here,他们也没有指定具体的时间。
答案 5 :(得分:0)
我不确定这是否是正确的做事方式,但这段代码对我来说效果很好。
在我的.h文件中:
@interface MyViewController : UIViewController {
int tapCount;
}
@property (nonatomic, assign)int tapCount;
@end
在我的.m文件中:
@synthesize tapCount;
- (void)tapGesture:(UIGestureRecognizer*)gesture {
tapCount = tapCount + 1;
[self performSelector:@selector(correctTapCount) withObject:nil afterDelay:0.3];
}
-(void)correctTapCount {
if (tapCount == 1) {
NSLog(@"Single Tap");
}
if (tapCount == 2) {
NSLog(@"Double Tap");
}
//reset TapCount
tapCount = 0;
}
这是我添加点击监听器(它在UIImageView上)的地方
//add tap listener
carImage.userInteractionEnabled = YES;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];
[carImage addGestureRecognizer:tap];
[tap release];
祝你好运,快乐的编码!