iPhoneカスタム地図アプリを作る3つのポイント

iPhoneでカスタム地図アプリを作ろうと思ったら意外とはまったので
ポイントを紹介しておきます。

最初に今回実現したい技術的な要素はこんな感じです

  • 任意の場所を指定
  • ピンを立てる
  • ピンアイコンをカスタイマイ
  • ピンに情報を表示させる

では実際のポイント

1) 基本(最低限必要なクラスの準備)
1つめのポイントはクラス設計
デリゲートやインタフェース実装クラスを使う必要があるので、
クラス設計をしてから実装することをお勧めします
(私は勢いで実装しようとして、はまりました)
アプリのViewControllerでCLLocationManagerとMKMapViewを利用
UIViewController
私の場合は上記の様にデリゲートしてViewControllerにメンバでCLLocationManagerのインスタンスを保持しました
MKMapViewはInterfaceBuilderでViewに追加した上で
インスタンスを保持してリンクします

アノテーション(MKAnnotation)を実装するクラスを利用
ユーザに指定された場所にフラグを立てて、情報を表示させるために
MKAnnotationを実装するクラスを用意します
実際にはこのクラスもViewControllerで必要に応じて
インスタンスを生成して利用します
@interface MyAnnotation : NSObject
位置情報やタイトルを保持するメンバ変数を設定しておくことが
必要です

2) iPhoneのタップイベントハンドリング実装
2つ目のポイントは
検出時にインスタンスを生成して、必要な情報を詰めこんでやります
具体的にはUITapGestureRecognizerのインスタンスを生成して
ハンドリングするイベント種別を設定(numberOfTapsRequired)
ビューにインスタンスを設定(mapView addGestureRecognizer)
このあたりを実装すれば、例えばダブルタップ検出時(numberOfTapsRequired=2)にフラグを設定する実装が可能になります

3) MKAnnotationの活用
3つ目のポイントは、ダブルタップ検出時にアノテーション情報を
うまく組み込んでやることで、画面に落ちるピン画像を変更したり
ピンをタップしたときの情報を設定することが可能になります
具体的にはMKMapViewとCLLocationManagerを使って、タップした
位置情報を取得。

CGPoint location = [sender locationInView:mapView];
CLLocationCoordinate2D mapPoint = [ mapView convertPoint:location toCoordinateFromView:mapView];

MKAAnnotationのインスタンスを生成し、
取得した位置情報や、ピンをタップしたときに表示させる情報の設定を行います

CLLocationCoordinate2D coordinate_;
coordinate_.latitude = [[pinProp objectForKey:@"latitude"] doubleValue];
coordinate_.longitude = [[pinProp objectForKey:@"longitude"] doubleValue];
annotation = [[MyAnnotation alloc] initWithPinProp:pinProp];
[mapView addAnnotation:annotation];

最後にアイコンの変更はピンの表示イベントハンドル

  • (MKAnnotationView*)mapView:(MKMapView*)_mapView viewForAnnotation:()annotation{

で必要に応じてannotationView.imageで設定すると色々と遊べます(笑)

iPhoneのオモチャ箱 iPhone SDKプログラミング

iPhoneのオモチャ箱 iPhone SDKプログラミング