如何正确设置MKPointAnnotation坐标更改的动画

时间:2017-06-29 07:57:33

标签: ios iphone swift mkmapview

我想在地图视图上为MKPointAnnotation的坐标更改设置动画,如下所示:

let destinationLocation = CLLocationCoordinate2D(latitude: 51.873983, longitude: 12.627966)  

UIView.animate(withDuration: 20, animations: {
        self.myAnnotation.coordinate = destinationLocation
}, completion: nil)

我在地图上添加了这样的图钉:

let startPosition = CLLocationCoordinate2D(latitude: 53.014542, longitude: 13.996593)

myAnnotation.coordinate = startPosition

mapView.addAnnotation(myAnnotation)

myAnnotation是一个在我的ViewController中声明的全局变量:

private let myAnnotation = MKPointAnnotation()

但是当我在动画期间缩放地图时(调用MKMapViewDelegate的方法regionDidChangeAnimated),图钉的位置移动到地图上的错误位置,而不是缩放时的正确地图坐标。

我在这里上传了一个能够很好地描述问题的截屏视频。

https://wetransfer.com/downloads/46a0ea2bdc0703ac392581532d3713f920170630095741/7f6499e7a38737a1f04740cd933ddaee20170630095741/dd2b2d

我不知道提供短视频的另一种可能性。大小只有8 MB。这是查看问题的最佳方式。

1 个答案:

答案 0 :(得分:1)

每当用户与地图交互(缩放,滚动)时,你可以/应该停止动画

if let annotationView = self.mapView.view(for: self.myAnnotation) {
    annotationView.layer.removeAllAnimations()
}

此外,您可以实现动画的完成处理程序,以便在取消/成功的动画上正确操作:

UIView.animate(withDuration: 20, animations: {
    self.myAnnotation.coordinate = destinationLocation
}, completion:  { success in
    if success {
        // handle a successfully ended animation
    } else {
        // handle a canceled animation, i.e move to destination immediately
        self.myAnnotation.coordinate = destinationLocation
    }
})