web-dev-qa-db-ja.com

SwiftでMapKitアノテーションの座標変更をアニメーション化しますか?

SwiftのiOS8で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のSwiftコード:

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

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

あなたはほとんどそれを正しく持っています! MyAnnotation実装でこの行を変更するだけです。

var coordinate : CLLocationCoordinate2D

これに:

dynamic var coordinate : CLLocationCoordinate2D

それはそれを修正します。

なぜこれが重要なのですか?注釈アニメーションはKVO(キー値の監視)に依存しているためです。 Swiftでは、プロパティはdynamicとしてマークされていない限り、観測可能なキー値ではありません。 (もう少し技術的に言うと、KVOの監視は、プロパティセッターメソッドの実装をスウィズリングすることで機能するためです。ランタイムはクラスに直接到達し、そのプロパティのセッターコードを変更します。しかし、Swiftではそれができません。プロパティを明示的にdynamicとしてマークしない限り。)

64
matt