たぷつきません

おなかがでてきた。もうたぷついてるやん。

MapKitのアノテーション移動時の再描画

 MapKitではMapViewに追加済みのアノテーションの位置情報を変更することで、アノテーションビューが移動する。しかし表示上はすぐに反映されない。それではと、MapViewやアノテーションビューに対してNeedsLayoutを送ってみるが、やはり再描画されない。MapViewに対して純粋に「アノテーション更新したから再描画してー」という命令が見当たらなかった。アノテーションが新しい位置情報で地図上に現れるのは、地図をドラッグして表示範囲を少しでも変えた瞬間だった。地図範囲の移動によってアノテーションビューのFrameも移動しなければいけないので道理。
 そういうわけで、アノテーションを更新した際には、以下を実行してあたかも地図表示エリアが変更されたかのように振舞えばOKということがわかった。表示範囲は全く変更していなくてもアクセッサに同じ内容を突っ込むだけで良い*1

[mapView setRegion:mapView.region animated:NO];

ちなみに、animatedパラメータは真にしない方が良い。ビューのフリッピングなど他のアニメーションと絡むと再描画が先送りされて更新されないケースがあったためだ。

*1:iPhone SDK 3.1.3調べ