2010-06-20 240 views
8

在我的應用程序中,我添加了3.2 SDK中提供的新手勢識別器。一切似乎都正常工作,屏幕上的響應時間非常快。但由於某些原因,當我將requireGestureRecognizerToFail添加到我的某些手勢中時,手勢觸發時會出現非常明顯的延遲。以下是我用來創建手勢識別器的代碼片段。有誰知道爲什麼有一個延遲,我怎麼能解決它?我使用requireGestureRecognizerToFail來防止在用戶執行DoubleTap時觸發SingleTap手勢。iPad手勢識別器 - 延遲響應

- (void)createGestureRecognizers { 

//Single Finger Double-Tap 
UITapGestureRecognizer *singleFingerDTap = [[UITapGestureRecognizer alloc] 
      initWithTarget:self action:@selector(handleSingleDoubleTap:)]; 
    singleFingerDTap.numberOfTapsRequired = 2; 
    [super addGestureRecognizer:singleFingerDTap]; 

//Single Finger Tap 
UITapGestureRecognizer *singleFingerTap = [[UITapGestureRecognizer alloc] 
       initWithTarget:self action:@selector(handleSingleTap:)]; 
    singleFingerTap.numberOfTapsRequired = 1; 
[singleFingerTap requireGestureRecognizerToFail:singleFingerDTap]; 
[self addGestureRecognizer:singleFingerTap]; 

//Two Finger Pan 
UIPanGestureRecognizer *panGesture2 = [[UIPanGestureRecognizer alloc] 
      initWithTarget:self action:@selector(handlePanGesture2:)]; 
    panGesture2.maximumNumberOfTouches = 2; 
[super addGestureRecognizer:panGesture2]; 

//Single Finger Pan 
UIPanGestureRecognizer *panGesture1 = [[UIPanGestureRecognizer alloc] 
      initWithTarget:self action:@selector(handlePanGesture1:)]; 
    panGesture1.maximumNumberOfTouches = 1; 
[panGesture1 requireGestureRecognizerToFail:panGesture2]; 
[super addGestureRecognizer:panGesture1]; 

[singleFingerDTap release]; 
[singleFingerTap release]; 
    [panGesture1 release]; 
[panGesture2 release]; 
} 
+0

這不是預期的行爲?如果你要求它延遲其行動,直到另一個手勢失敗,那麼在此結束之前它不能發射。兩個水龍頭之間有時間跨度(水龍頭!=觸摸),所以你需要這個時間跨度。 – Eiko 2010-06-20 22:59:55

+0

謝謝,這很有道理! – Maddoxx 2010-06-21 00:38:21

回答

6

如果你想要一個和雙擊區分,必須等待足夠長的時間來弄清楚,沒有第二次敲擊時來臨前,你可以把它叫做一個水龍頭。另一種方法是設計所有的單擊操作,以便在檢測到雙擊時可以異步取消或恢復。例如,如果您有一次輕擊更改頁面和雙擊縮放,那麼您必須在單次敲擊時更改頁面的動畫,然後在檢測到第二次敲擊時反轉動畫和縮放。屆時,處理單擊的視圖可能已經移動。在大多數情況下,這是更麻煩和困惑,那麼它是值得的。

+1

現在我想起你所說的話,這是有道理的。由於我需要更多的實時響應,因此我必須回到自己處理Touch事件。謝謝! – Maddoxx 2010-06-21 00:36:51