Не уверен, в чем точная причина, но UIAlertView каким-то образом заставляет жест снова срабатывать. Обходной путь должен выполнить показ вне обработчика жеста, используя executeSelector:
-(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];
}