4

Новинка для iPhone dev. У меня есть представление, которое содержит UIScrollView, который содержит UIImageView. Я добавил (двойной) распознаватель жестов при просмотре изображения, который открывает окно предупреждения. По какой-то причине, и я уверен, что я просто отсталый, он открывается 3 раза.Использование UITapGestureRecognizer

Вот мой код:

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

Я только начал iPhone устр несколько дней назад. Эта проблема напоминает мне о проблемах с пузырьками событий, с которыми я столкнулся в javascript. Есть идеи?

+0

Да, и кажется, что стоит отметить, что NSLog не происходит все три раза. – tybro0103

ответ

10

Не знаете, в чем заключается конкретная причина, но UIAlertView каким-то образом приводит к тому, что жест снова загорается. Обойти это можно выполнить показ вне обработчика жестов с помощью 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:
жест распознаватель проходит через различные состояния в жесте (Стала, изменен, и т.д.), и он вызывает метод обработчика при каждом изменении состояния. Так лучше и, вероятно, правильное решение, чтобы проверить состояние свойство жест распознаватель в верхней части обработчика:

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

Проверка состояния была решением. Благодаря! – tybro0103

Смежные вопросы