Анимировать изменение координат аннотации MapKit в Swift?


При использовании MapKit в iOS 8 в Swift, как я могу сделать возможным анимировать изменение положения карты пользовательской аннотации? Я говорю это:

UIView.animateWithDuration(0.25) {
    var loc = ann.coordinate
    loc.latitude = loc.latitude + 0.0005
    loc.longitude = loc.longitude + 0.001
    ann.coordinate = loc
}

...где ann - пользовательская аннотация, MyAnnotation. Аннотация прыгает, а не анимируется, в новую координатную позицию.

Раздражает то, что анимация работает отлично , если я пишу MyAnnotation в Objective-C. Но если я напишу его в Swift, я не получу анимацию. еще!

К вашему сведению, вот мой Swift-код для MyAnnotation:

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

    init(location coord:CLLocationCoordinate2D) {
        self.coordinate = coord
        super.init()
    }
}
1 22

1 ответ:

Вы почти угадали! Просто измените эту строку в своей реализации MyAnnotation:

var coordinate : CLLocationCoordinate2D

К этому:

dynamic var coordinate : CLLocationCoordinate2D

Это все исправит.

Почему это имеет значение? Потому что анимация аннотаций основана на KVO (key value observing). В Swift свойство не является ключевым значением, наблюдаемым, если оно не помечено как dynamic. (Чтобы получить немного более технически, это в свою очередь потому, что наблюдение кво работает путем swizzling реализации метода установки свойств-время выполнения достигает прямо в ваш класс и изменяет код сеттера этого свойства. Но в Swift это невозможно сделать, если вы явно не пометите свойство как dynamic.)