4

Nouveau sur iPhone dev. J'ai une vue qui contient un UIScrollView qui contient un UIImageView. J'ai ajouté un (double) reconnaissance de gestes de robinet sur la vue d'image qui rend une boîte d'alerte ouverte. Pour une raison quelconque, et je suis sûr que je suis juste attardé, il s'ouvre 3 fois.Utilisation de UITapGestureRecognizer

Voici mon code:

- (void)viewDidLoad { 

    scrollView.delegate = self; 

    UIImage* image = imageView.image; 
    imageView.bounds = CGRectMake(0, 0, image.size.width, image.size.height); 
    scrollView.contentSize = image.size; 

    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; 
    tapGesture.numberOfTapsRequired = 2; 
    [imageView addGestureRecognizer:tapGesture]; 
    [tapGesture release]; 

    NSLog(@"LOADED"); 

    [super viewDidLoad]; 
} 

-(IBAction) handleTapGesture:(UIGestureRecognizer *) sender { 
    CGPoint tapPoint = [sender locationInView:imageView]; 
    int tapX = (int) tapPoint.x; 
    int tapY = (int) tapPoint.y; 
    NSLog(@"TAPPED X:%d Y:%d", tapX, tapY); 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"How are you?" delegate:nil cancelButtonTitle:@"I'm awesome." otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
} 

Je viens de commencer l'iPhone dev il y a quelques jours. Ce genre de problème me rappelle les problèmes de bulles que j'ai traités en javascript. Des idées?

+0

Oh, et il semble que cela vaut la peine de noter que le NSLog ne se produit pas tous les trois fois. – tybro0103

Répondre

10

Vous ne savez pas exactement quelle est la raison, mais le UIAlertView est en train de déclencher à nouveau le geste. Une solution consiste à exécuter la projection en dehors du gestionnaire de geste en utilisant performSelector:

-(void) handleTapGesture:(UIGestureRecognizer *) sender { 
    CGPoint tapPoint = [sender locationInView:imageView]; 
    int tapX = (int) tapPoint.x; 
    int tapY = (int) tapPoint.y; 
    NSLog(@"TAPPED X:%d Y:%d", tapX, tapY); 
    [self performSelector:@selector(showMessage) withObject:nil afterDelay:0.0]; 
} 

- (void)showMessage 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"How are you?" delegate:nil cancelButtonTitle:@"I'm awesome." otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
} 

Edit:
Dispositif de reconnaissance de geste passe par des états différents dans le geste (A commencé, modifié, etc.) et il appelle la méthode de gestionnaire chaque fois que l'état change. Ainsi, une solution meilleure et probablement correcte est de vérifier la propriété de l'état de la reconnaissance du geste en haut du gestionnaire:

-(void) handleTapGesture:(UIGestureRecognizer *) sender { 
    if (sender.state != UIGestureRecognizerStateEnded) // <--- 
     return;           // <--- 

    CGPoint tapPoint = [sender locationInView:imageView]; 
    int tapX = (int) tapPoint.x; 
    int tapY = (int) tapPoint.y; 
    NSLog(@"TAPPED X:%d Y:%d", tapX, tapY); 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:@"How are you?" delegate:nil cancelButtonTitle:@"I'm awesome." otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
} 
+0

Vérification de l'état était la solution. Merci! – tybro0103

Questions connexes