答案 0 :(得分:2)
如果您创建另一个动画,但对于与现有动画不同的区域,则会使现有动画无效。注意:如果我尝试创建一个新动画,但对于相同的visibleMapRect,iOS将忽略它。
func stopZoom() {
//the trick: creating a region very similar to the existing one
var mapRegion:MKCoordinateRegion = MKCoordinateRegionForMapRect(self.mapView.visibleMapRect)
mapRegion.span.latitudeDelta = mapRegion.span.latitudeDelta + 0.000001
UIView.animateWithDuration(0.1, delay: 0.0, options: [], animations: {
let mapRegion:MKCoordinateRegion = mapRegion
self.mapView.setRegion(mapRegion, animated: true) //this will invalidate the other animations
}) { (completed: Bool) -> Void in
}
}
以参考startZoom方法:
func startZoom() {
UIView.animateWithDuration(10, delay: 0.0, options: [UIViewAnimationOptions.CurveLinear, UIViewAnimationOptions.AllowUserInteraction, UIViewAnimationOptions.BeginFromCurrentState], animations: {
let mapRegion:MKCoordinateRegion = MKCoordinateRegionMakeWithDistance(self.coordinate, 500, 500)
self.mapView.setRegion(mapRegion, animated: true)
}) { (completed: Bool) -> Void in
}
}
花了很多时间来解决这个问题,我希望它会对你有所帮助。
答案 1 :(得分:0)
您可能尝试的一件事是创建一个与屏幕刷新率相关联的CADisplayLink
,然后在其回调中,检查地图的当前状态。在那里,您可以将另一个setRegion:animated:
调用到当前位置,以便停止上一个动画。
答案 2 :(得分:-1)
最简单的方法是nil
MKMapView
的委托,以便之后不会调用任何委托方法。
self.mapView.delegate = nil;