したがって、すべてのピンが追加されたMKMapViewがあり、ピンの色は、そのピンに値が設定されているかどうかによって異なります。アプリを最初にロードすると、viewForAnnotation
が呼び出され、それに応じて色が設定されます。ただし、ピンの詳細(場所、タイトルなど)を更新すると、pinColourも更新されて更新されないことがわかります。最初の追加後にviewForAnnotation
が再度呼び出されないようです。
私はこれに似た多くの質問を読みました、そして私はそれを確認することができますmapView.delegate = self;
これが私のviewForAnnotation
コードです。
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(MapAnnotation *)annotation
{
if([annotation class] == MKUserLocation.class)
return nil;
NSString *pinIdentifier = annotation.identifier; // This is a unique string for each pin and is getting populated every time!
MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:pinIdentifier];
if(annotationView == nil)
annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinIdentifier];
else
annotationView.annotation = annotation; // Never had this line fire...
annotationView.canShowCallout = YES;
annotationView.animatesDrop = NO;
annotationView.enabled = YES;
annotationView.tag = annotation.counter;
if(annotation.pinColour == Stopped) // from enum
annotationView.pinColor = MKPinAnnotationColorRed;
else
annotationView.pinColor = MKPinAnnotationColorGreen;
UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[infoButton addTarget:self action:@selector(mapCalloutButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
infoButton.tag = annotation.counter;
annotationView.rightCalloutAccessoryView = infoButton;
return annotationView;
}
ピンを追加するコードは次のとおりです。
CLLocationCoordinate2D annotationCoord;
annotationCoord.latitude = latestPosition.latitude;
annotationCoord.longitude = latestPosition.longitude;
MapAnnotation *annotation = [[MapAnnotation alloc] init];
annotation.coordinate = annotationCoord;
annotation.identifier = theIdentifier;
annotation.title = theTitle;
annotation.subtitle = theSubtitle
annotation.pinColour = [self getPinColour];
annotation.counter = theCounter;
[theMapView addAnnotation:annotation];
ピンを更新するコードは次のとおりです(追加する別の方法):
updatePin = true;
pinCounter = mapPin.counter;
CLLocationCoordinate2D annotationCoord;
annotationCoord.latitude = latestPosition.latitude;
annotationCoord.longitude = latestPosition.longitude;
[mapPin setCoordinate:annotationCoord];
mapPin.identifier = theIdentifier;
mapPin.subtitle = theSubtitle;
mapPin.pinColour = [self getPinColour];
何が欠けているのかわかりません。 viewForAnnotation
は明らかに機能しており、最初の追加後に呼び出されることはありません。この関数を呼び出すと、アプリを再起動すると色が変わるので、100%確実に機能します。
編集:ああ、私は本当に注釈を削除して再追加し始めたくありません。それはとにかく私が短期的にやっていることです!
マップビューが注釈をキャッシュする方法のため、外観を変更する必要がある場合は、注釈を削除して再度追加する必要があります。簡単な削除と追加がその方法です。キャッシュ無効化メカニズムはありませんが、これです。
実際、これがあなたのために働いたかどうかはわかりませんが、これが私がそれをした方法です。
マップから注釈を削除する必要はありませんでした。私がする必要があるのは、パラメータ注釈の注釈ビューを提供するようにマップに指示することだけです。マップは正しい注釈を返します。そこから、カスタムアノテーションのプロパティを使用して、アクティブアイテムであるかどうかを識別します。アクティブな場合は、通常のピンイメージを表示し、そうでない場合は、完全なピンイメージを表示します。
-(void)updateAnnotationImage:(CustomAnnotation *)paramAnnotation
{
MKAnnotationView *av = [geoMap viewForAnnotation:paramAnnotation];
if (paramAnnotation.active)
{
av.image = [UIImage imageNamed:@"PinNormal.png"];
}
else
{
av.image = [UIImage imageNamed:@"PinFull.png"];
}
}
少し遅れましたが、うまくいけば、この問題に遭遇した他の人に役立つでしょう。
また、この回答が役に立ちました: この場合、mapView:viewForAnnotation:が呼び出されますか?
AddAnnotationメソッドを呼び出すときはいつでも
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id < MKAnnotation >)annotation gets called.
Swift 2.1:
私は同じ問題を抱えていて、迅速な解決策を見つけました。必要に応じてこれをトリガーし、メインスレッドに送信することも賢明です。
var annotationsArray = mapView.annotations
mapView.removeAnnotations(mapView.annotations)
mapView.addAnnotations(arrayIncs)
arrayIncs.removeAll()
これをXamarinで機能させるために、ほんの数時間を費やしました。これは、他のXamarin開発者に対する警告です。 GetViewForAnnotationデリゲートではなく、ViewForAnnotationメソッドを使用していることを確認してください。既存のアノテーションビューの代わりに新しいアノテーションビューを返す間違ったメソッドを使用していました...もちろん、それは機能していませんでした!