双击还是两个单击?

Jak*_*čar 13 iphone

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

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

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

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

它必须是准确正确的数量,以最佳状态工作,但绝对不小,或者有一个为错误的机会(同时单输出和双抽头).

yun*_*nas 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];
Run Code Online (Sandbox Code Playgroud)

  • 我正在改变已接受的答案,因为现在似乎是正确的方法.但在评论之前的答案并将其他答案称为垃圾之前,请记住它们是在您之前和UITapGestureRecognizer存在之前3年发布的;) (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

对我来说这个代码工作完全正常.... :)最后的帖子是在8月15日左右....但我正在经历同样的问题所以想分享我发现的解决方案....


Tra*_*vis 8

在Apple提供的iPhone应用程序编程指南示例中:事件处理(由意大利用户提及)使用延迟0.3:

[self performSelector:@selector(handleSingleTap:) withObject:touchLoc afterDelay:0.3];


Jak*_*čar 5

在developer.apple.com上的开发者论坛上,Apple开发人员说:

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

我已将此作为错误68405提交给Apple .