14 Stimmen

Doppeltippen oder zwei Einfachtippen?

Wie lange dauert es auf dem iPhone OS, bis zwei Berührungen als doppeltes Antippen gewertet werden?

// Edit: Warum ist das wichtig?

Um einfaches und doppeltes Tippen unterschiedlich zu handhaben, sagt Apples Anleitung, dass man Folgendes tun soll performSelector...afterDelay mit einem "vernünftigen" Intervall beim ersten Antippen (und brechen Sie es später ab, wenn das zweite Antippen erkannt wird).

Das Problem ist, dass, wenn das Intervall zu kurz ist (0,1), die Einzel-Tap-Aktion ausgeführt wird, auch wenn man doppelt tippt (wenn man sich nur auf tapCount verlässt). Ist das Intervall zu lang (0,8), wartet der Benutzer unnötigerweise darauf, dass der Einfachtipp erkannt wird, obwohl es keine Möglichkeit für einen Doppeltipp gibt.

Es muss sein genau die richtige Anzahl, um optimal zu funktionieren, aber auf keinen Fall kleiner, sonst besteht die Gefahr von Fehlern (gleichzeitiges einfaches und doppeltes Tippen).

11voto

yunas Punkte 4113

Sie können eine beliebige Anzahl von Antippen durch die Antipp-Geste erkennen. Sie müssen nicht mehr mit NSTouches entweder. Für alle Benutzer, die nach einer Lösung suchen, hier ist sie.

Diese einfachen Codezeilen erfüllen die Aufgabe der Einzel- und Doppeltippfunktion.

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

10voto

yunas Punkte 225
- (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

bei mir funktioniert dieser Code einwandfrei.... :) der letzte Beitrag war um den 15. August 09.... aber ich hatte das gleiche Problem und wollte die Lösung, die ich gefunden habe, teilen....

8voto

Travis Punkte 1786

In dem von Apple bereitgestellten Beispiel des Programmierhandbuch für iPhone-Anwendungen: Ereignisbehandlung (vom Nutzer Italien erwähnt) eine Verzögerung von 0.3 verwendet wird:

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

5voto

Jaka Jančar Punkte 10976

In den Entwicklerforen auf developer.apple.com sagte ein Apple-Entwickler:

  • Es gibt kein konstantes Zeitintervall, aber die systemweite Definition ist heute implizit in der Eigenschaft tapCount von UITouch enthalten.
  • Es gibt keinen Standardwert für diese Verzögerung und für die Touch-and-Hold-Verzögerung.
  • SpringBoard hat den Wert fest einkodiert.

Ich habe dies bei Apple eingereicht als Wanze 68405 .

1voto

Itay Punkte 1669

Ich glaube nicht, dass es ein Standard-Zeitlimit gibt - es kommt darauf an, was sich beim Ausprobieren richtig anfühlt. Apple hat ein Beispiel aquí wo sie auch keine bestimmte Zeit angeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X