如何检测 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
}
我正在编写一个 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
:
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
}