MKAnnotationView
MKAnnotationViewは、独自に作成したアノテーションを使用したい場合に用いるクラスです。
標準で用意されているピンで構わない場合は、MKPinAnnotationViewクラスが用意されているのでそちらを使用します。
MKAnnotationViewのクラス階層
生成
// 生成例
-(MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
static NSString *PinIdentifier = @"Pin";
MKAnnotationView *av =
(MKAnnotationView*)
[mv dequeueReusableAnnotationViewWithIdentifier:PinIdentifier];
if(av == nil){
av = [[[MKAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:PinIdentifier] autorelease];
}
return av;
}
MKAnnotationViewの生成は、通常viewForAnnotationデリゲートメソッドの中で行います。
viewForAnnotaionデリゲートメソッドにはMKAnnotaionプロトコルを実装したアノテーションが引き渡されてきて、それを元にMKAnnotationViewのインスタンスを生成します。
生成時はメモリ節約のために、一度生成したインスタンスは再利用するようにコーディングします。
(UITableViewCellでも同じ仕組みでメモリを節約しています)
MKAnnotationViewのプロパティ
プロパティ名/型 | 読専 | 説明 |
---|---|---|
canShowCallout (BOOL) |
コールアウトを表示するしないの設定 YES:コールアウトを使用する NO:コールアウトを使用しない(デフォルト) (例)av.canShowCallout = YES; |
|
image (UIImage) |
アノテーションの画像を指定する (例)画像(hoge.png)を指定する; av.image = [UIImage imageNamed:@"hoge.png"]; |
|
leftCalloutAccessoryView (UIView) |
コールアウトの左に表示するUIViewを指定する (例)コールアウトの左にDetailDisclosureボタンを指定する; UIButton *b = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; av.leftCalloutAccessoryView = b; |
|
rightCalloutAccessoryView (UIView) |
コールアウトの右に表示するUIViewを指定する (例)コールアウトの右にDetailDisclosureボタンを指定する; UIButton *b = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; av.rightCalloutAccessoryView = b; |
主要なプロパティのみ掲載しています。
上記「MKAnnotationViewのクラス階層」にあるクラスのプロパティも使用できます。
MKAnnotationView例文
// MKMapViewのデリゲートを自分自身に設定する
mv.delegate = self;
// 経度緯度情報を作成(ここでは東京都庁の経度緯度を例としています)
CLLocationCoordinate2D co;
co.latitude = 35.68664111; // 経度
co.longitude = 139.6948839; // 緯度
// アノテーションを地図へ追加
HogeAnnotation *ha = [[[HogeAnnotation alloc] init] autorelease];
ha.coordinate = co;
ha.title = @"Hoge";
[mv addAnnotation:ha];
※HogeAnnotationはMKAnnotationプロトコルを実装した自作クラス。
(HogeAnnotationクラスは、MKPinAnnotationViewページの一番下のサンプルを参照ください。)
※mvはMKMapViewインスタンス。
// アノテーションが表示される時に呼ばれる
-(MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
static NSString *PinIdentifier = @"Pin";
MKAnnotationView *av =
(MKAnnotationView*)
[mv dequeueReusableAnnotationViewWithIdentifier:PinIdentifier];
if(av == nil){
av = [[[MKAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:PinIdentifier] autorelease];
av.image = [UIImage imageNamed:@"hoge.png"]; // アノテーションの画像を指定する
av.canShowCallout = YES; // ピンタップ時にコールアウトを表示する
}
return av;
}