ios - 选择时不要为 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
}
解决方案
您可以尝试覆盖类:
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
}
}
}
推荐阅读
- c++ - Qt如何在套接字等待响应时显示请等待对话框?
- php - 如何在 laravel api 中显示验证错误,同时将表单请求文件与控制器分开
- php - 动态在图像上写入文本并将文本居中
- java - Dockerized Zuul Gateway 无法连接到 dockerized Eureka Server
- visual-studio-mac - 有没有办法让 Visual Studio for Mac OS 识别文件名的大小写?
- node.js - 如何使用 Mongoose 克隆 Mongodb 数据库
- wpf - 断点停止工作 - WPF 应用程序是来自 Visual Studio 的桌面桥接
- c - 如何按字母顺序对指针数组进行排序,然后使用qsort?
- python - Matplotlib contourf - 输入 z 必须至少是 2x2 数组?
- webpack - Webpack:链接加载器