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()
}
}
あなたはほとんどそれを正しく持っています! MyAnnotation実装でこの行を変更するだけです。
var coordinate : CLLocationCoordinate2D
これに:
dynamic var coordinate : CLLocationCoordinate2D
それはそれを修正します。
なぜこれが重要なのですか?注釈アニメーションはKVO(キー値の監視)に依存しているためです。 Swiftでは、プロパティはdynamic
としてマークされていない限り、観測可能なキー値ではありません。 (もう少し技術的に言うと、KVOの監視は、プロパティセッターメソッドの実装をスウィズリングすることで機能するためです。ランタイムはクラスに直接到達し、そのプロパティのセッターコードを変更します。しかし、Swiftではそれができません。プロパティを明示的にdynamic
としてマークしない限り。)