我有一个带有注释的MKMapView。我的目标是在地图完成滚动后隐藏注释(如果选择了注释)。
调用注释时,我将注释分配到变量中以对其进行跟踪。
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
lastSelectedAnnotation = view.annotation
}
我知道:
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool){ }
但是,我无法弄清楚(这里是初学者)如何检测地图是否完成了其区域更改,因此我可以调用函数:
func hideSelectedAnnotation(_ mapView: MKMapView) {
DispatchQueue.main.async {
mapView.deselectAnnotation(self.lastSelectedAnnotation, animated: true)
self.lastSelectedAnnotation = nil
}
}
点击附件按钮时,我也会隐藏注释:
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl){
hideSelectedAnnotation(mapView)}
我尝试保存该区域的坐标,并将其与地图进行比较,但地图不必将注释居中。我也可以启动一个计时器,当regionDidChangeAnimated不再被称为隐藏注释时。但这就像屠杀一样。
感谢您的帮助!
答案 0 :(得分:1)
我认为您已经知道了...
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool){
// Call your function here
}
地图视图区域每次更改时都应触发(除非用户的手指造成了更改)
-----编辑-----
不幸的是,您必须使用UIPanGestureRecognizer来检测用户输入。
我成功使用了UIPanGestureRecognizer,如下所示:
lazy var mapPanGestureRecognizer: UIPanGestureRecognizer = {
let gr = UIPanGestureRecognizer(target: self, action: #selector(draggedMap))
gr.delegate = self
return gr
}()
您还必须使用以下命令将UIPanGestureRecognizer添加到地图中
yourMap.addGestureRecognizer(mapPanGestureRecognizer)
然后您可以通过检查手势状态来管理#selector函数中发生的事情,就像这样
@objc func draggedMap(panGestureRecognizer: UIPanGestureRecognizer) {
// Check to see the state of the passed panGestureRocognizer
if panGestureRecognizer.state == UIGestureRecognizer.State.began {
// Do something
}
}
状态是使您可以确定用户是结束手势,处于手势中间还是开始手势的状态。 List of possible states