首页 > 解决方案 > 选择时不要为 MKMarkerAnnotationView 设置动画

问题描述

我想在 上捕获点击MKMarkerAnnotationView,而不是在发生这种情况时为视图设置动画。

通过 my 的委托MKMapView,我可以捕获大致相当于点击 theMKMarkerAnnotationView的选择和取消选择(点击不属于 的标签时也会发生选择MKMarkerAnnotationView

我正在尝试删除默认动画。我没有找到一个简单的解决方案。

我试过了:

1/在选择过程中将视图设置为不选择。这确实会取消动画,但不会捕获更多的点击。

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    view.setSelected(false, animated: false)
    // or
    view.isSelected = false
    handleTap(view)
}

2/ 在视图上添加另一个点击手势识别器并防止其他手势识别器接收触摸。这很好用,除非我点击标签而不是注释视图。

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    let view = dequeueReusableAnnotationView(withIdentifier: reuseIdentifier) as? MKMarkerAnnotationView ??
        MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
    view.annotation = annotation
    view.gestureRecognizers?.forEach { view.removeGestureRecognizer($0) }
    let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTap(gesture:)))
    gestureRecognizer.delegate = self
    view.addGestureRecognizer(gestureRecognizer)
    return view
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return false
}

标签: iosmapkitmapkitannotation

解决方案


您可以尝试覆盖类:

final class CustomMarkerAnnotationView: MKMarkerAnnotationView {
  var onSelect: (() -> Void)?

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(false, animated: false)
    if selected {
      onSelect?() // or catch this in delegate
    }        
  }
}

推荐阅读