前回は、現在地情報を取得して、それにつぶやきを付けるところまでを説明した。今回は、このつぶやきを地図上に表示してみよう。これには、Map Kitを使う。
Map KitとMpa View
Map Kitは、iPhone OS 3.0から追加された、地図の表示を扱う事ができるフレームワークだ。iPhoneには標準で「マップ」というアプリケーションが付属するが、あれとまったく同じ地図が表示できるようになる。地図データは、Google Mapsを利用している。したがって、地図の精度や対応地域は、Google Mapsの仕様に準じる事になる。
Map Kitは、Interface Builderに統合されている。だから、アプリ上に地図を表示するのはとても簡単だ。実際にやってみよう。
前回作ったユーザインタフェースに、地図表示機能を付け加えてみる。まずは、xibファイルをInterface Builderで開こう。そして、ライブラリパネルにあるMap Viewを、ウインドウにドラッグして追加してやる。これは、MKMapViewというクラスになる。
これだけで、もう地図が使えるようになる。試しに、このままアプリケーションをビルドして起動してみよう。ズームアウトされた状態の世界地図が表示されるはずだ。あとは、ピンチイン/アウトやダブルタップで、地図内を自由に移動できる。
アノテーションの作成
次に、地図の上にピンをさす事を考えよう。このピンのような、地図上に表示して注意を惹かせるものを、アノテーションと呼ぶ。現在地を表す青いポイントも、アノテーションの一種である。
Map Kitでは、アノテーションを表すために、MKAnnotaionというプロトコルを用意している。このプロトコルには、1つのプロパティと、2つのメソッドが定義されている。座標を表すcoordinate、タイトルを表すtitle、サブタイトルを表すsubtitleだ。
List 1.
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
- (NSString*)title;
- (NSString*)subtitle;
これらのうち、titleとsubtitleの実装はオプションとなっている。
実際にアプリでMKAnnotationを利用するときは、このプロトコルに準拠したクラスを作るか、Map Kitに含まれているサブクラスを利用する事になる。今回は、自分でクラスを作ってみよう。
SpotLogAnnotationというクラスを実装する。宣言は次のようになる。
List 2.
@interface SpotLogAnnotation : NSObject <MKAnnotation>
{
NSDictionary* _logDict;
}
// プロパティ
@property (nonatomic, retain) NSDictionary* logDict;
@end
NSObjectのサブクラスだが、MKAnnotationに準拠している。ログ情報を管理するために、_logDictというインスタンス変数と、そのプロトコルを定義している。
実装は、次のようにしてみた。
List 3.
@implementation SpotLogAnnotation
@synthesize logDict = _logDict;
- (CLLocationCoordinate2D)coordinate
{
// 座標を取得する
CLLocationCoordinate2D coordinate;
coordinate.latitude = [[_logDict objectForKey:@"latitude"] doubleValue];
coordinate.longitude = [[_logDict objectForKey:@"longitude"] doubleValue];
return coordinate;
}
- (NSString*)title
{
// ログテキストを取得する
return [_logDict objectForKey:@"log"];
}
@end
MKAnnotationに含まれている、cordinateプロトコルとtitleメソッドを実装してみた。どちらも、ログ情報から必要なものを取得して、適切な形に変換して返してやっている。
これで、アノテーションの準備はできた。
ピンの表示
後は、アノテーションを作成して、MKMapViewに追加してやるだけである。これには、addAnnotation:というメソッドを使う。
List 4.
- (void)addAnnotation:(id <MKAnnotation>)annotation;
MKMapViewにアノテーションを追加すると、それに対応するビューがマップ上に追加される。このビューは、デフォルトだとピンを表すものになる。もちろん、カスタマイズすることも可能だ。ここでは、とりあえずピンをそのまま使う事にしよう。
ログ情報を表示するために、次のようなメソッドを実装しよう。
List 5.
- (void)showLog:(NSDictionary*)logDict
{
// アノテーションを作成する
SpotLogAnnotation* annotation;
annotation = [[SpotLogAnnotation alloc] init];
[annotation autorelease];
annotation.logDict = logDict;
// アノテーションを追加する
[_mapView addAnnotation:annotation];
}
まず、ログ情報をもとにSpotLogAnnotationクラスを作成する。そして、それをMKMapViewに追加してやればいい。これで、地図上にピンが現れる。
現れたピンをタップしてみよう。すると黒い吹き出しが出てきて、その中にタイトルが表示される。
これで、地図上につぶやきを表示する事ができるようになった。次回は、いろいろな詳細情報を表示させてみよう。
ここまでのソースコード: SpotLog-2.zip