2009-11-07 9 views
29

Je souhaite charger de façon synchronisée des images pour mon MKAnnotationView personnalisé; J'utilise déjà le framework EGOImageView (ça marche très bien avec UITableViews), mais je n'arrive pas à le faire fonctionner sur MKMapView. Les images semblent être chargées, mais je ne peux pas les rafraîchir sur la carte - [myMap setNeedsDisplay] ne fait rien.Rafraîchir MKAnnotationView sur un MKMapView

Répondre

35

Je n'ai pas essayé moi-même, mais il pourrait fonctionner:
une vue d'annotation en utilisant la méthode MKMapView - (MKAnnotationView *)viewForAnnotation:(id <MKAnnotation>)annotation et définir la nouvelle image à elle.

Edit: essayé de le faire moi-même et cette approche a bien fonctionné pour moi:

// 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"]; 
} 

Après avoir appelé cette méthode toutes les images annotations ont été mises à jour.

+0

Voilà comment c'est fait maintenant. Mais cette image est chargée de manière synchrone. – cocoapriest

+0

Et si vous l'appelez après le chargement de l'image et réglez cette image sur la vue - cela ne fonctionne-t-il pas? – Vladimir

+0

c'est la question - comment définir cette image plus tard. Ce faisant, l'image n'est pas mise à jour sur le MKAnnotationView – cocoapriest

2

Ceci est la seule façon que j'ai trouvé à la force de redessiner MKAnnotationViews:

// mise à jour de la force de vue sur la carte (sinon des vues d'annotation ne redessiner)

CLLocationCoordinate2D centre = mapView.centerCoordinate;

mapView.centerCoordinate = center;

Semble inutile, mais cela fonctionne.

+1

Non, ce n'est pas le cas. Je viens d'essayer: ( –

+0

fonctionne pour moi! Merci – nurxyz

+0

Fonctionne pour moi aussi .. – pnizzle

14

Je trouve qu'un seul moyen fiable de mettre à jour l'annotation, d'autres méthodes ne fonctionnent pas pour moi: il suffit de retirer et d'annotation ajoutant encore:

id <MKAnnotation> annotation; 

// ... 

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

Ce code fera - [Mapview: viewForAnnotation:] être appelé à nouveau et ainsi votre vue d'annotation sera à nouveau créée (ou peut-être réutilisée si vous utilisez dequeueReusableAnnotationViewWithIdentifier) ​​avec les données correctes.

+0

j'ai fini par utiliser cette technique pour des annotations simples rafraîchissement – nurxyz

+0

I J'essaie d'utiliser cette méthode, et je veux que ça fonctionne, mais ça ne semble pas se comporter de manière fiable en fonction du niveau de zoom, parfois la broche semble trop décalée vers la gauche/droite, et la légende n'est plus aligné.(C'est avec des images de broche qui ont des changements subtils mais qui sont par ailleurs identiques dans la composition, avec le centre de la broche au centre de l'image.) Hmm ... –

+0

Oui, j'ai dû ajouter des annotations pour les rafraîchir. – coolcool1994

1

Cela a fonctionné pour moi

#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

(je ne vois pas comment indiquer que ce poste a trait à la réponse de zerodiv.) Je suis en mesure d'obtenir la méthode de zerodiv travailler en ajoutant un Kickstart en quelque sorte, ce qui oblige une coordonnée insignifiante mais différente, puis la restauration de la précédente, correcte. L'écran ne clignote pas du tout à cause du premier emplacement.

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

mapView.centerCoordinate = forceChg; 
mapView.centerCoordinate = center;