如何在mapView上更新MKAnnotation对象的位置?

时间:2017-05-28 23:06:02

标签: ios swift mkannotation cllocation apple-maps

我有以下代码,目的是遍历当前Apple地图视图中的所有注释并更新其位置坐标。

for existingMarker in self.mapView.annotations {

    existingMarker.coordinate.latitude = 12.12121212
    existingMarker.coordinate.longitude = 14.312121121          
}

可悲的是,这是不允许的。我被告知'坐标'是一个唯一的属性。所以这显然不是我想要更新MKAnnotation已经在mapView上绘制的注释的位置。那怎么办呢?具体来说,我想这样做并让地图“重绘”新坐标尽快。我确信这一定是可能的,因为它似乎是一个常见的用例。

1 个答案:

答案 0 :(得分:9)

创建自己的MKAnnotation课程,其中(a)coordinate不是只读的;以及(b)它是dynamic,例如:

class MyAnnotation: NSObject, MKAnnotation {
    dynamic var coordinate: CLLocationCoordinate2D
    dynamic var title: String?
    dynamic var subtitle: String?

    init(coordinate: CLLocationCoordinate2D, title: String? = nil, subtitle: String? = nil) {
        self.coordinate = coordinate
        self.title = title
        self.subtitle = subtitle

        super.init()
    }
}

然后使用它代替MKPointAnnotation。显然,您应该使用比MyAnnotation更具描述性的名称。

另外,当你移动它们时,你真的应该将它们转换为你所谓的新注释类:

for existingMarker in self.mapView.annotations {
    if let annotation = existingMarker as? MyAnnotation {
        annotation.coordinate = CLLocationCoordinate2D(latitude: 12.12121212, longitude: 14.312121121)
    }
}

或者

self.mapView.annotations.flatMap({ $0 as? MyAnnotation}).forEach {
    $0.coordinate = CLLocationCoordinate2D(latitude: 12.12121212, longitude: 14.312121121)
}