iPhone でなめらかにズームできる地図のサンプルを公開



iPhone で San Francisco の鉄道・バス路線図を表示するサンプルアプリを作ってみたのでソースを公開します。

http://github.com/psychs/iphone-samples/tree/master/SFMap

単純に地図の PDF を描画するとすごく重くなってしまうので、大きさの違う画像をいくつか用意して、ズームに従って表示する画像を変えていくようにしています。

UIScrollView を使ってナイーブに実装すると、UIScrollView のズーム状態を外からコントロールすることができないので、ズームが終了するたびに UIScrollView 自体を作り直したりする必要があります。

そこで、今回は UIImageView のサブクラスを作り、

- (void)setTransform:(CGAffineTransform)value;
{
  float scale = 1.0f / previousScale;
  [super setTransform:CGAffineTransformScale(value, scale, scale)];
}

というふうに setTransform メソッドを上書きしてやることで、ズーム中に UIScrollView から渡されるスケールを読み替え、ズームに従って大きさの違う画像に差し替えていくことを実現しました。

なお、地図のデータは San Francisco Municipal Transportation Agency のサイト上で配布されている PDF から作りました。

http://www.sfmta.com/cms/mmaps/official.htm