2010-06-20 17 views
8

ritardata Nella mia app ho aggiunto le nuove Recognizers gesto che sono disponibili nel 3.2 SDK. Tutto sembra funzionare correttamente e il tempo di risposta sullo schermo è stato molto veloce. Ma per qualche motivo quando aggiungo lo requireGestureRecognizerToFail ad alcuni dei miei gesti, c'è un ritardo molto visibile quando il gesto viene attivato. Di seguito è riportato uno snippet del codice che utilizzo per creare i Gesture Recognizers. Qualcuno sa perché c'è un ritardo e come posso risolvere il problema? Sto utilizzando requireGestureRecognizerToFail per impedire che il gesto SingleTap venga attivato quando l'utente esegue un DoubleTap.iPad Gesture Recognizer - Risposta

- (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

Non è un comportamento previsto? Se gli chiedi di ritardare la sua azione fino a quando un altro gesto fallisce, allora non può sparare finché non è finita. E due tocchi hanno un intervallo di tempo tra di loro (tocca! = Tocca), quindi è necessario passare questo intervallo di tempo. – Eiko

+0

Grazie, ha perfettamente senso! – Maddoxx

risposta

6

Se si vuole distinguere tra un rubinetto singolo e doppio, è necessario attendere abbastanza a lungo per capire che nessun secondo tocco è in arrivo prima che si può chiamare un unico tocco. L'alternativa sarebbe quella di progettare tutte le singole azioni di tocco in modo tale che possano essere annullate o ripristinate in modo asincrono quando viene rilevato un doppio tocco.

Ad esempio, se si ha un solo tocco per modificare le pagine e un doppio tocco per lo zoom, è necessario animare una pagina cambiando con un solo tocco, quindi invertire l'animazione e lo zoom quando viene rilevato un secondo tocco. A quel punto, la vista che gestiva il singolo tocco potrebbe essersi spostata. Nella maggior parte dei casi, questo è più problemi e confusione, allora vale la pena.

+1

Ora che penso a quello che hai detto, ha perfettamente senso che c'è un ritardo. Poiché ho bisogno di una risposta in tempo reale, dovrò tornare a gestire gli eventi Touch da solo. Grazie! – Maddoxx

Problemi correlati