如何检测 MKMapView 上的点击但忽略 MKAnnotationViews 上的点击

How to detect taps on MKMapView but ignore taps on MKAnnotationViews

我正在编写一个 iOS 应用程序,用户可以在其中点击 MKMapView 来放置图钉(MKAnnotationView 子类),然后点击现有图钉将其删除。

添加新图钉和删除旧图钉是可行的,但点击删除现有图钉是导致新图钉被删除。

如何更新我的代码,以便 UITapGestureRecognizer 检测地图上的点击但忽略地图注释上的点击?

我目前正在使用 UITapGestureRecognizer:

检测 MKMapView 上的点击
@objc func tapHandler(_ gesture: UITapGestureRecognizer)
  {
    let location = recogniser.location(in: self.parent.mapView)
    let coordinate = self.parent.mapView.convert(location, toCoordinateFrom: self.parent.mapView)
    parent.shapeCoordinates.append(coordinate)
    self.redrawTheMap()
  }

我正在使用 MKMapViewDelegate:

检测 pin 上的点击
  func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)
  {
    if let myAnnotation = view.annotation as? CustomAnnotation
    {
      parent.shapeCoordinates.remove(at: myAnnotation.index)
      self.redrawTheMap()
    }
  }

目前 UITapGestureRecognizer 正在接收 MKMapView 上的所有点击,无论它们是否在 MKAnnotationView 上。

终于自己解决了。诀窍是使用 UIGestureRecognizerDelegate 拦截点击并决定 UITapGestureRecognizer 是否应该处理它。

以下委托方法代码检查已点击的内容,如果是 MKPinAnnotationView 则忽略它:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
  {
    if (touch.view.self?.isKind(of: MKPinAnnotationView.self) == true)
    {
      return false
    }
    return true
  }