デリゲート メソッドでは、選択した注釈が型MKUserLocation
であるかどうかを確認できます。型である場合は、画像を変更しません。
MKUserLocation
ユーザー位置アノテーションの文書化されたクラスです。
これらのデリゲート メソッドでは、2 番目のパラメーターはMKAnnotationView
.
そのクラスにはannotation
、ビューの基になる注釈モデル オブジェクトを指すプロパティがあります。プロパティのタイプを確認しannotation
ます。
例えば:
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)annotation{
if ([annotation.annotation isKindOfClass:[MKUserLocation class]])
{
//it's the user location, do nothing
return;
}
annotation.image = [UIImage imageNamed:@"pinIconOn.png"];
}
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)annotation{
if ([annotation.annotation isKindOfClass:[MKUserLocation class]])
{
//it's the user location, do nothing
return;
}
annotation.image = [UIImage imageNamed:@"pinIconOff.png"];
}
2 つの追加の提案:
annotation
これらのデリゲート メソッドでは、パラメーターに名前を付けないでください。ドキュメントで提案されているのと同じ名前を使用します。これはview
、それがパラメーターの実際の名前であるためです。これは注釈のビューオブジェクトであり、注釈モデルオブジェクト自体ではありません。これにより、デリゲート メソッドのコードがわかりにくくなります。
に変更(MKAnnotationView *)annotation
する(MKAnnotationView *)view
と、チェックが になりif ([view.annotation isKindOfClass:[MKUserLocation class]])
ます。
理想的には、ビュー上の画像を変更するだけでなく、これらのデリゲート メソッドが呼び出されたときに、注釈モデル オブジェクトに「選択された」状態を格納する必要があります。次に、 でviewForAnnotation
、コードは注釈の状態をチェックし、デリゲート メソッドと同じロジックを使用してそこに画像を設定する必要があります (「選択」されているかどうかに基づいて異なる画像)。ユーザーがマップをズーム/パンすると、イメージが で指定された値に戻る場合がありますviewForAnnotation
。