カスタムMKAnnotationViewの画像を非同期で読み込みたいのですが。私は既にEGOImageViewフレームワークを使用しています(UITableViewsで非常にうまくいきます)が、MKMapViewで機能させることができません。画像は読み込まれているようですが、地図上で更新できません-[myMap setNeedsDisplay]
は何もしません。
私自身は試していませんが、うまくいくかもしれません:
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"];
}
このメソッドを呼び出した後、すべての注釈画像が更新されました。
アノテーションを更新する信頼できる方法は1つしか見つかりませんでしたが、他の方法ではうまくいきませんでした。単にアノテーションを削除して追加するだけです。
id <MKAnnotation> annotation;
// ...
[mapView removeAnnotation:annotation];
[mapView addAnnotation:annotation];
このコードにより、-[mapView:viewForAnnotation:]が再度呼び出されるため、正しいデータでアノテーションビューが再作成されます(またはdequeueReusableAnnotationViewWithIdentifierを使用する場合は再利用されます)。
これは、MKAnnotationViewsを強制的に再描画するための唯一の方法です。
//マップビューを強制的に更新します(それ以外の場合、注釈ビューは再描画されません)
CLLocationCoordinate2D center = mapView.centerCoordinate;
mapView.centerCoordinate = center;
役に立たないようですが、動作します。
これは私のために働いた
#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];
}
(この投稿がzerodivの回答に関連していることを示す方法がわかりません。)ある種のキックスタートを追加し、意味のない、異なる座標を強制し、以前の正しい座標を復元することにより、zerodivのメソッドを機能させることができました。最初の場所のため、画面はまったく点滅しません。
CLLocationCoordinate2D center = mapView.centerCoordinate;
CLLocationCoordinate2D forceChg;
forceChg.latitude = 0;
forceChg.longitude = curLongNum;
mapView.centerCoordinate = forceChg;
mapView.centerCoordinate = center;