检测MapView完成更改区域

时间:2019-03-30 00:17:30

标签: swift mkmapview mkannotation

我有一个带有注释的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不再被称为隐藏注释时。但这就像屠杀一样。

感谢您的帮助!

1 个答案:

答案 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