双击还是两个单击?

时间:2009-08-15 18:26:37

标签: iphone

在iPhone OS上,两次点击被认为是双击的时间限制是什么?

//编辑:为什么这很重要?

为了以不同的方式处理单击和双击,Apple的指南说要在第一次点击时以{合理'的间隔执行performSelector...afterDelay(如果检测到第二次点击,则稍后取消)。

问题是如果间隔太短(0.1),即使双击(如果仅依赖于tapCount,也会)执行单击操作。如果它太长(0.8),当没有可能进行双击时,用户将不必要地等待识别单击。

必须正好正确的数字,以便最佳地工作,但绝对不能更小,或者有机会出现错误(同时单击和双击)。

6 个答案:

答案 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开发人员说:

  • 没有恒定的时间间隔,但今天系统范围的定义隐含在UITouch的tapCount属性中。
  • 此延迟和触摸保持延迟没有默认值。
  • SpringBoard的值是硬编码的。

我已将此作为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];

祝你好运,快乐的编码!