我正在开发一个地图应用程序,其中我必须根据用户位置使飞机动画
因此,我通过将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
预先感谢
答案 0 :(得分:0)
我求助于从CLLocationsCoords计算“ UIKit”坐标,并添加了一个std UIImageView,以便移动动画。 解决方案差但是很有效。 :(