2012/04/22

MKUserLocationのcalloutを非表示にする

MKMapViewには現在地を表示する機能があります。現在地には見慣れた青丸のマーカーが自動的に表示され、タップすると「現在地」と表示されます。これは便利なんですが、マーカーが現在地というのは自明なので吹き出しは不要に思えます。そこで、この表示(callout)を消せないか調べてみました。
MKMapViewでは、Mapに追加されたAnnotationを表示する際に、delegateのviewForAnnotationが呼び出されます。通常はここで対応するviewを生成し、calloutの設定も行うのですが、MKUserLocationではnilを返すことで標準のMKUserLocationViewが生成される仕組みになっています。
そこで、MKUserLocationViewを自分で生成しようと思ったのですが、どうやらこのクラスは非公開のようです。とはいえ、実際にviewが生成されるのはこの関数の呼び戻し後なので、viewの設定を書き換えることはできません。
そこで、このviewを返すタイミングでMKUserLocationのタイトルをnilに設定してみました。予想通りMKUserLocationViewはtitle属性をチェックしてcalloutの表示、非表示を決めているようで、タップに応答しなくなりました。
- (MKAnnotationView *) mapView:(MKMapView *)targetMapView 
             viewForAnnotation:(id ) annotation
{
    if([annotation isKindOfClass:[MKUserLocation class]]){
        ((MKUserLocation *)annotation).title = nil;
    }
    return nil;
}

0 件のコメント:

コメントを投稿