2010-04-14 5 views
4

J'essaie de détecter les doubles taps sur une vue, mais quand le double tapage arrive, le premier tapement déclenche une action sur TouchesBegan, donc, avant de détecter un double tap, un seul tap est toujours détecté premier.iphone - double tap fail safe way

Comment puis-je faire cela d'une manière qui ne détecte que le double tap?

Je ne peux pas utiliser les gestes d'OS 3.x, parce que je dois le rendre compatible avec les anciennes versions d'OS.

merci

Répondre

14

Quelques extraits de l'exemple tapZoom du code exemple scrollViewSuite:

Tout d'abord, la fonction pour lancer des choses une fois que la touche est terminée:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 

    if ([touch tapCount] == 1) { 

      [self performSelector: @selector(handleSingleTap) 
         withObject: nil 
         afterDelay: 0.35]; // after 0.35s we call it a single tap 

    } else if([touch tapCount] == 2) { 

      [self handleDoubleTap]; 
    } 

} 

Deuxièmement: intercepter le message si un nouveau contact se produit pendant le délai d'attente:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    [NSObject cancelPreviousPerformRequestsWithTarget: self 
              selector: @selector(handleSingleTap) 
               object: nil]; 
} 

voir aussi: http://developer.apple.com/iphone/library/documentation/WindowsViews/Conceptual/UIScrollView_pg/ZoomingByTouch/ZoomingByTouch.html#//apple_ref/doc/uid/TP40008179-CH4-SW1

et ici: (Suite ScrollView) http://developer.apple.com/iphone/library/samplecode/ScrollViewSuite/Introduction/Intro.html

+0

merci. Désolé pour le retard. – SpaceDog

2

Regardez-vous le tapCount? Par exemple:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
     UITouch *touch = [[event allTouches] anyObject]; 
     if (touch.tapCount == 2) { 
        //double-tap action here 
     } 
} 
6

Edit: Je Maladroit que vous avez dit que vous ne pouvez pas utiliser des gestes 3.x, c'est donc une réponse invalide à votre question, mais je pars au cas où quelqu'un qui peut utiliser des gestes 3.x peut en bénéficier.

Vous pouvez créer deux systèmes de reconnaissance de geste, un pour seul robinet et un pour taper deux fois:

UITapGestureRecognizer *singleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouchesOne:)]; 
singleTapGesture.cancelsTouchesInView = NO; 
singleTapGesture.delaysTouchesEnded = NO; 
singleTapGesture.numberOfTouchesRequired = 1; // One finger single tap 
singleTapGesture.numberOfTapsRequired = 1; 
[self.view addGestureRecognizer:singleTapGesture]; 
[singleTapGesture release]; 

UITapGestureRecognizer *doubleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouchesTwo:)]; 
doubleTapGesture.cancelsTouchesInView = NO; 
doubleTapGesture.delaysTouchesEnded = NO; 
doubleTapGesture.numberOfTouchesRequired = 1; // One finger double tap 
doubleTapGesture.numberOfTapsRequired = 2; 
[self.view addGestureRecognizer:doubleTapGesture]; 
[doubleTapGesture release]; 

Et puis, voici le coup de poing:

[singleTapGesture requireGestureRecognizerToFail : doubleTapGesture]; 

La dernière ligne, rend votre unique Appuyez sur handler travail seulement si le double robinet échoue. Donc, vous obtenez à la fois une seule tape et double tap dans votre application.

+0

Vraiment un coup de poing ... tout en utilisant les deux gestes. [SingleTapGesture requireGestureRecognizerToFail: doubleTapGesture]; Sauvé beaucoup de temps ma. –