iOS MapView: добавление аннотации при нажатии, но не при нажатии существующей аннотации


У меня есть настройка UITapGestureRecognizer для добавления аннотации на карту, где пользователь нажимает. Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь нажимает на существующую аннотацию, чтобы просмотреть всплывающую подсказку, всплывающая подсказка всплывает, но другая аннотация добавляется на карту позади выбранной аннотации. Есть ли способ определить, была ли выбрана аннотация, и вернуться до добавления аннотации?

Это мой viewDidLoad:

UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(foundTap:)];
singleTapRecognizer.numberOfTapsRequired = 1;
[self.mapView addGestureRecognizer:singleTapRecognizer];

И моя функция on touch:

-(IBAction)foundTap:(UITapGestureRecognizer *)recognizer
{
    CGPoint point = [recognizer locationInView:self.mapView];

    CLLocationCoordinate2D tapPoint = [self.mapView convertPoint:point toCoordinateFromView:self.view];

    AGIAnnotation * annotation = [[AGIAnnotation alloc] initWithCoordinate:tapPoint];
    // Some other stuff

    [self.mapView addAnnotation:annotation];
}

Любая помощь это ценится.

2 7

2 ответа:

Существует Uigesturerecognizerdelegate протокол

Реализовать gestureRecognizer:shouldReceiveTouch: и вернуть NO, если прикосновение находится на существующей подсказке. Что-то вроде этого:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view isKindOfClass:[MKPinAnnotationView class]])
    {
        return NO;
    }
    return YES;
}

@mbehan Ответ в Swift 3+:

In ViewDidLoad:

let singleTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourClass.foundTap(_:)))
singleTapRecognizer.delegate = self
mapView.addGestureRecognizer(singleTapRecognizer)

И расширение UIGestureRecognizerDelegate:

extension YourClass: UIGestureRecognizerDelegate {
  func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    return !(touch.view is MKPinAnnotationView)
  }
}