2010-06-20 11 views
8

In meiner App habe ich die neuen Gesture Recognizer hinzugefügt, die im 3.2 SDK verfügbar sind. Alles scheint korrekt zu funktionieren und die Reaktionszeit auf dem Bildschirm war sehr schnell. Aber aus irgendeinem Grund, wenn ich zu einigen meiner Gesten requireGestureRecognizerToFail hinzufüge, gibt es eine sehr sichtbare Verzögerung, wenn die Geste ausgelöst wird. Unten ist ein Ausschnitt des Codes, mit dem ich die Gestenerkenner erstelle. Weiß jemand, warum es eine Verzögerung gibt und wie ich es beheben kann? Ich verwende requireGestureRecognizerToFail, um zu verhindern, dass die SingleTap Geste ausgelöst wird, wenn der Benutzer eine DoubleTap ausführt.iPad Gesture Recognizer - Verzögerte Antwort

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

Ist das nicht erwartetes Verhalten? Wenn Sie es bitten, seine Aktion zu verzögern, bis eine andere Geste fehlschlägt, kann es nicht auslösen, bis dies vorbei ist. Und zwei Taps haben eine Zeitspanne zwischen ihnen (Taps! = Berührt), so dass Sie diese Zeitspanne benötigen, um zu bestehen. – Eiko

+0

Danke, das macht Sinn! – Maddoxx

Antwort

6

Wenn Sie zwischen einem Einzel- und Doppel-Tippen unterscheiden wollen, müssen Sie lange genug warten, um herauszufinden, dass kein zweiter Wasserhahn kommt, bevor Sie es ein einfaches Antippen aufrufen können. Die Alternative wäre, all Ihre einzelnen Antippaktionen so zu gestalten, dass sie asynchron abgebrochen oder rückgängig gemacht werden können, wenn ein Doppeltipp erkannt wird.

Wenn Sie zum Beispiel eine einzelne Tap-Wechsel-Seite und einen Doppeltipp-Zoom haben, müssten Sie eine Seite animieren, die nur einmal tippen, dann die Animation umkehren und stattdessen zoomen, wenn eine zweite Berührung erkannt wird. Bis dahin kann sich die Ansicht, die den einzelnen Tipp bearbeitet hat, verschoben haben. In den meisten Fällen ist das mehr Ärger und Verwirrung als es wert ist.

+1

Jetzt, wo ich darüber nachdenke, was du gesagt hast, macht es Sinn, dass es eine Verzögerung gibt. Da ich eine Antwort in Echtzeit benötige, muss ich wieder mit den Touch-Ereignissen alleine fertig werden. Vielen Dank! – Maddoxx