web-dev-qa-db-ja.com

MKMapViewのMKAnnotationViewを更新する

カスタムMKAnnotationViewの画像を非同期で読み込みたいのですが。私は既にEGOImageViewフレームワークを使用しています(UITableViewsで非常にうまくいきます)が、MKMapViewで機能させることができません。画像は読み込まれているようですが、地図上で更新できません-[myMap setNeedsDisplay]は何もしません。

29
cocoapriest

私自身は試していませんが、うまくいくかもしれません:
MKMapView - (MKAnnotationView *)viewForAnnotation:(id <MKAnnotation>)annotationメソッドを使用して注釈用のビューを取得し、それに新しいイメージを設定します。

編集:それを自分でやろうとしましたが、このアプローチは私にとってうまくいきました:

//  Function where you got new image and want to set it to annotation view
for (MyAnnotationType* myAnnot in myAnnotationContainer){
    MKAnnotationView* aView = [mapView viewForAnnotation: myAnnot];
    aView.image = [UIImage imageNamed:@"myJustDownloadedImage.png"];
}

このメソッドを呼び出した後、すべての注釈画像が更新されました。

35
Vladimir

アノテーションを更新する信頼できる方法は1つしか見つかりませんでしたが、他の方法ではうまくいきませんでした。単にアノテーションを削除して追加するだけです。

id <MKAnnotation> annotation;

// ...

[mapView removeAnnotation:annotation];
[mapView addAnnotation:annotation];

このコードにより、-[mapView:viewForAnnotation:]が再度呼び出されるため、正しいデータでアノテーションビューが再作成されます(またはdequeueReusableAnnotationViewWithIdentifierを使用する場合は再利用されます)。

14
ivanzoid

これは、MKAnnotationViewsを強制的に再描画するための唯一の方法です。

//マップビューを強制的に更新します(それ以外の場合、注釈ビューは再描画されません)

CLLocationCoordinate2D center = mapView.centerCoordinate;

mapView.centerCoordinate = center;

役に立たないようですが、動作します。

2
ZeroDiv

これは私のために働いた

#import "EGOImageView.h"

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    //ENTER_METHOD;    
    if([annotation isKindOfClass:[MKUserLocation class]]) return nil;  
    MKPinAnnotationView *annView;

    static NSString *reuseIdentifier = @"reusedAnnView";
    annView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    annView.canShowCallout = YES;
    annView.calloutOffset = CGPointMake(-5.0f, 0.0f);
    annView.opaque = NO;
    annView.image = [[UIImage imageNamed:@"tempImage.png"] retain];

    YourModel *p = annotation; // make this conform to <MKAnnotation>
    EGOImageView *egoIV = [[EGOImageView alloc] initWithPlaceholderImage:[UIImage imageNamed:@"tempImage.png"]];
    [egoIV setDelegate:self];
    egoIV.imageURL = [NSURL URLWithString:p.theUrlToDownloadFrom];
    [annView addSubview:egoIV];
    [egoIV release];


    return [annView autorelease];
}
1
johndpope

(この投稿がzerodivの回答に関連していることを示す方法がわかりません。)ある種のキックスタートを追加し、意味のない、異なる座標を強制し、以前の正しい座標を復元することにより、zerodivのメソッドを機能させることができました。最初の場所のため、画面はまったく点滅しません。

CLLocationCoordinate2D center = mapView.centerCoordinate; 
CLLocationCoordinate2D forceChg;
forceChg.latitude = 0;
forceChg.longitude = curLongNum;

mapView.centerCoordinate = forceChg;
mapView.centerCoordinate = center;
1
Jack Bellis