2011-02-28 1 views
4

Je veux détecter JUST double/single tap lorsque l'utilisateur touche une vue.Détecte seulement le tapotement double ou simple avec UIViews?

je fait quelque chose comme ceci:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint prevLoc = [touch ] 
    if(touch.tapCount == 2) 
     NSLog(@"tapCount 2"); 
    else if(touch.tapCount == 1) 
     NSLog(@"tapCount 1"); 
} 

Mais il détecterait 1 robinet avant 2 robinets. Comment puis-je détecter seulement 1/2 robinet?

+2

Je pense que c'est mieux. http://stackoverflow.com/questions/7175086/iphone-single-tap-gesture-conflicts-with-double-one – KJLucid

Répondre

0

Maby vous pouvez utiliser un certain intervalle de temps. Attendez avec l'envoi de l'événement pour (x) ms. Si vous obtenez deux taps dans cette période, envoyez un double-tap. Si vous n'obtenez qu'un seul envoi, appuyez une seule fois.

2

Il aidera à définir des méthodes pour robinets simples et doubles

(void) handleSingleTap {} 
(void) handleDoubleTap {} 

Alors dans touchesEnded vous pouvez appeler la méthode appropriée en fonction du nombre de robinets, mais seulement appeler handleSingleTap après un délai pour vous assurer deux robinet n'a pas été exécuté:

-(void) touchesEnded(NSSet *)touches withEvent:(UIEvent *)event { 
    if ([touch tapCount] == 1) { 
     [self performSelector:@selector(handleSingleTap) withObject:nil 
      afterDelay:0.3]; //delay of 0.3 seconds 
    } else if([touch tapCount] == 2) { 
     [self handleDoubleTap]; 
    } 
} 

En touchesBegan, annuler toutes les demandes de handleSingleTap afin que le second robinet annule l'appel de la première prise à handleSingleTap et seulement handleDoubleTap volonté être appelé

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

Cool, cela a fonctionné! merci – RVN

+0

Pour ajouter le code dans votre message, donnez un espace de tabulation à chaque ligne ou utilisez l'option Code en haut et collez le code dans cet espace – RVN

3

Merci pour votre aide. J'ai également trouvé un moyen comme ça:

-(void)handleSingleTap 
{ 
    NSLog(@"tapCount 1"); 
} 

-(void)handleDoubleTap 
{ 
    NSLog(@"tapCount 2"); 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSUInteger numTaps = [[touches anyObject] tapCount]; 
    float delay = 0.2; 
    if (numTaps < 2) 
    { 
     [self performSelector:@selector(handleSingleTap) withObject:nil afterDelay:delay ];  
     [self.nextResponder touchesEnded:touches withEvent:event]; 
    } 
    else if(numTaps == 2) 
    { 
     [NSObject cancelPreviousPerformRequestsWithTarget:self];    
     [self performSelector:@selector(handleDoubleTap) withObject:nil afterDelay:delay ]; 
    }    
}