如何在MKMapView Swift上动画化MKOverlay的移动

时间:2018-10-17 14:03:57

标签: ios swift animation mkmapview mkoverlay

我正在开发一个地图应用程序,其中我必须根据用户位置使飞机动画

因此,我通过将MKPlaneAndArrow子类化实现了自定义类MKOverlay

class MKPlaneAndArrow : NSObject, MKOverlay {

  //@objc dynamic var coordinate: CLLocationCoordinate2D
  //the above method also does not change location

  //to change the coordinate after initialization
  var coordinate: CLLocationCoordinate2D {
    willSet {
      willChangeValue(forKey: #keyPath(coordinate))
    }
    didSet {
      didChangeValue(forKey: #keyPath(coordinate))
    }
  }

  var boundingMapRect: MKMapRect

  init( center: CLLocationCoordinate2D, boundingMapRect_: MKMapRect) {

    self.coordinate = center
    self.boundingMapRect = boundingMapRect_

  }

}

现在,当调用位置委托didUpdateLocations时,我想将MKPlaneAndArrow叠加层的坐标更改为当前位置坐标,因此我在didUpdateLocations内写了以下内容

    //if not already added annotation
if !HomeVC.flagAlreadyAddedPlaneAnnotation {

    let planeAndArrow = MKPlaneAndArrow.init(center: lastUserLocation.coordinate, boundingMapRect_: mapRect)
    mapView.add(planeAndArrow)
    //Did updateLocations will not add the annotation again
    HomeVC.flagAlreadyAddedPlaneAnnotation = true

}
//get last user location
guard let lastUserLocation:CLLocation = locations.last  else {
    print("no location")
    return
}
 //change coordinate of `MKPlaneAndArrow` overlay
for overlay in mapView.overlays {

    if let myPlane = overlay as? MKPlaneAndArrow {
     myPlane.coordinate = lastUserLocation.coordinate 
    }
}

我有设置断点,他们碰到了myPlane.coordinate = ...行 但是我不知道为什么在地球上坐标变化在地图上不可见


动画

如果上面的代码更改了坐标,则不会使更改生效。我也想让它动起来。就像在Google Maps或Apple Maps上移动用户位置

我成功地用动画更改了MKAnnotation的坐标。但是有了覆盖,我一直在搜索几个小时,但是找不到解决方法

我在SO上看到了以下一些其他问题

注释:

  • 无法使用 MkAnnotation,因为如果您缩放它们,它们将保持相同的大小,而叠加层的大小则相对于缩放比例

  • 如果您需要我的MKOverlayRenderer课程,请在评论中提问。我的渲染器只是使用`context.draw

  • 绘制图像

预先感谢

1 个答案:

答案 0 :(得分:0)

我求助于从CLLocationsCoords计算“ UIKit”坐标,并添加了一个std UIImageView,以便移动动画。 解决方案差但是很有效。 :(