2009-08-15 89 views
13

在iPhone OS上,兩次敲擊被認爲是雙擊的時間限制是多少?雙擊或兩個單擊?

//編輯:爲什麼這很重要?

爲了以不同的方式處理單擊和雙擊,Apple的指南說在第一次點擊時有一些「合理的」間隔做performSelector...afterDelay(如果第二次點擊被檢測到,則稍後取消)。

問題是,如果間隔太短(0.1),即使在雙擊時(如果只依賴於tapCount,也就是說),將執行單擊操作。如果時間太長(0.8),那麼當沒有可能進行雙擊時,用戶將不必要地等待單擊被識別。

它必須是正好正確的號碼,以最佳狀態工作,但絕對不小,或者有一個爲錯誤的機會(同時單輸出和雙抽頭)。

+0

您可能想要指定您詢問的平臺。 – retracile 2009-08-15 18:30:36

+0

縮回,檢查標籤。 – JoshJordan 2009-08-15 18:31:28

+0

@retracile:在這個問題上有一個「iphone」標籤(當然,也許35秒前,當你發佈你的評論時,它就不存在);所以,我猜它是在iphone平臺上;-) – 2009-08-15 18:31:55

回答

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]; 
+2

我正在改變對此的接受答案,因爲它似乎是現在這樣做的正確方法。但在評論以前的答案並稱其他答案爲垃圾之前,請記住,它們在您的UITapGestureRecognizer甚至存在之前的3年之前發佈;) – 2013-03-09 20:55:09

+0

這是我的另一個帳戶:D – yunas 2013-07-25 09:29:55

+0

沒有手動計時器或延遲,迫使您決定多少msecs等待,真棒! – cprcrack 2013-10-25 13:11:17

1

我不相信有一個默認的時間限制 - 它是任何「感覺」,當你嘗試了。蘋果有一個例子here,他們也沒有指定具體的時間。

+0

必須有一個限制,因爲如果點擊是相隔一秒的話,UITouch的tapCount不會增加,但是如果它們靠得很近,它的確會有所增加。 – 2009-08-15 18:39:41

5

論developer.apple.com開發者論壇,蘋果的開發者表示:

  • 有沒有固定的時間間隔,但全系統的定義是隱含在今天UITouch的tapCount財產。
  • 此延遲和觸摸並保持延遲沒有默認值。
  • SpringBoard的硬編碼值。

我已將此提交給Apple,作爲bug 68405

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 

對於我這個代碼工作prefectly罰款.... :)過去後約爲09年8月15日.... 但我正在經歷這樣認爲分享我找到了解決同樣的問題....

0

我不知道這是否是做事的正確方法,但這段代碼對我來說效果很好。

@interface MyViewController : UIViewController { 

int tapCount; 

} 
@property (nonatomic, assign)int tapCount; 
@end 
在我的.m文件

在我.h文件中

@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]; 

好運和快樂編碼!