2015-04-21 27 views
20

在Swift中使用iOS 8中的MapKit時,如何使自定義註釋的地圖位置變化動畫成爲可能?我這樣說:Swift中的Animate MapKit註釋座標變化?

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。註釋跳躍,而不是動畫,到新的座標位置。

令人討厭的是,如果我在Objective-C中編寫MyAnnotation,動畫完美地運行。但是如果我用Swift編寫它,我不會再看到動畫了!

僅供參考,這裏是我的雨燕代碼MyAnnotation:

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

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

回答

53

你幾乎擁有它吧!只要改變這條線在你MyAnnotation實現:

var coordinate : CLLocationCoordinate2D 

這樣:

dynamic var coordinate : CLLocationCoordinate2D 

這將解決這個問題。

這是爲什麼?因爲註釋動畫依賴於KVO(鍵值觀察)。在Swift中,除非它被標記爲dynamic,否則屬性不是可觀察的關鍵值。 (爲了獲得更多技術性,反過來是因爲KVO觀察通過調整屬性setter方法的實現來工作 - 運行時直接進入您的類並更改該屬性的setter代碼,但在Swift中,它不能這麼做除非您明確將該物業標記爲dynamic。)