カスタム イメージをオンMKAnnotationView
にしてピンを置き換えることに成功しました (関数を使用しましたsetImage
)。MKMapView
ただし、タイプが「標準」の場合のみ機能します。サテライト モードとハイブリッド モードでは常にピンが表示されます。
この奇妙な問題を解決するアイデアはありますか?
カスタム イメージをオンMKAnnotationView
にしてピンを置き換えることに成功しました (関数を使用しましたsetImage
)。MKMapView
ただし、タイプが「標準」の場合のみ機能します。サテライト モードとハイブリッド モードでは常にピンが表示されます。
この奇妙な問題を解決するアイデアはありますか?
yonelからの回答を拡張するには、すでに作成されているMKAnnotationView.imageプロパティのsetImageを使用して、MapViewControllerのメイン部分に新しい画像を設定することはできません。
MapViewControllerは、MKMapViewDelgateメソッドを実装している必要があります。
- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
その中で、注釈が追加されたときにマップから通知されます。
したがって、annotationViewをカスタマイズするには、MKAnnotationを拡張し、独自のアノテーションクラスを作成する必要があります。このカスタムアノテーションインスタンスを追加するだけで、mapViewにこのアノテーションタイプ(つまりクラス)用にカスタマイズされた(拡張された、つまり独自の)annotationViewも自動的に表示されます。
つまり、delegateメソッドは、カスタムアノテーションが追加されたことを通知するため、そこでアノテーションクラスを確認し、それがアノテーションクラスである場合は、カスタムannotationViewの新しいインスタンスを作成します。
つまり、このcustomAnnotationクラスのinitメソッドを次のように使用します。
- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)identifier
このメソッドは自分で実装する必要があります。
この方法では、setImageを使用して任意の画像を設定できます。これは、このannotationViewに使用されます。
あなたの使用法では、MapTypeが変更されたときに設定された画像が消去されたと思います。これはおそらく、マップのannotationViewの新しいインスタンスを作成していたためです(これは新しいマップであり、注釈を再度追加し、annnotationViewsを再作成しました)。デリゲートメソッドから)。
initメソッドで画像を設定した場合、画像は失われません(常にインスタンスに設定されているため)。
これは役に立ちますか?
答えは、MKPinAnnotationView の代わりに MKAnnotationView を使用することです。
奇妙なことに、両方のサブジェクト (カスタム MKAnnotationView とマップ モード) がリンクされていません。
ピンを交換する方法は奇妙に思えます (setImage ?)。「古典的な」方法は、
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation
デリゲートでカスタム注釈ビューを返し、MKMapViewDelegate
プロトコルを実行します。