2015-04-21 19 views
20

Quando si utilizza MapKit in iOS 8 in Swift, come è possibile rendere possibile l'animazione di una modifica nella posizione della mappa di un'annotazione personalizzata? Dico questo:Animate MapKit modifica coordinate annotazione in Swift?

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

... dove ann è un'annotazione personalizzato, MyAnnotation. L'annotazione salta, non si anima, nella nuova posizione delle coordinate.

La cosa fastidiosa è che l'animazione funziona perfettamente se si scrive MyAnnotation in Objective-C. Ma se lo scrivo in Swift, non ho più l'animazione!

Proprio A proposito, ecco il mio codice Swift per MyAnnotation:

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

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

risposta

53

Devi quasi bene! Basta cambiare questa linea nell'implementazione MyAnnotation:

var coordinate : CLLocationCoordinate2D 

a questo:

dynamic var coordinate : CLLocationCoordinate2D 

che lo risolverà.

Perché questo è importante? Perché l'animazione delle annotazioni si basa su KVO (osservazione dei valori chiave). In Swift, una proprietà non è un valore chiave osservabile a meno che non sia contrassegnato come dynamic. (Per essere un po 'più tecnico, a sua volta perché l'osservazione KVO funziona accelerando l'implementazione del metodo di settaggio della proprietà - il runtime raggiunge direttamente la classe e cambia il codice setter della proprietà.) In Swift, non può farlo a meno che non si contrassegni esplicitamente la proprietà come dynamic.)