2009-11-07 16 views
29

Vorrei caricare le immagini in sincronia per il mio MKAnnotationView personalizzato; Sto già usando il framework EGOImageView (va molto bene con UITableViews), ma non riesco a farlo funzionare su MKMapView. Le immagini sembrano essere caricate, ma non posso aggiornarle sulla mappa - [myMap setNeedsDisplay] non fa nulla.Aggiorna MKAnnotationView su un MKMapView

risposta

35

Non ho provato io stesso, ma potrebbe funzionare:
avere una visione per l'annotazione utilizzando MKMapView - (MKAnnotationView *)viewForAnnotation:(id <MKAnnotation>)annotation metodo e impostare nuova immagine ad esso.

Edit: provato a fare che io e questo approccio ha funzionato bene per me:

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

Dopo aver chiamato questo metodo tutte le immagini annotazioni sono stati aggiornati.

+0

ecco come è fatto ora. Ma in questo modo l'immagine viene caricata in modo sincrono. – cocoapriest

+0

E se lo chiami dopo che l'immagine è stata caricata e imposta questa immagine sulla vista - non funziona? – Vladimir

+0

questa è la domanda: come impostare questa immagine in seguito. In questo modo, l'immagine non viene aggiornata su MKAnnotationView – cocoapriest

2

Questo è l'unico modo che ho trovato per imporre ridisegno di MKAnnotationViews: aggiornamento

// vigore della guarda la mappa (altrimenti viste di annotazione non ridisegnare)

centro CLLocationCoordinate2D = mapView.centerCoordinate;

mapView.centerCoordinate = center;

Sembra inutile, ma funziona.

+1

No, non è così. Ho appena provato :( –

+0

funziona per me! Grazie – nurxyz

+0

Funziona anche per me .. – pnizzle

14

ho trovato solo un modo affidabile per aggiornare l'annotazione, altri metodi non ha funzionato per me: solo la rimozione e l'aggiunta di annotazioni di nuovo:

id <MKAnnotation> annotation; 

// ... 

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

Questo codice renderà - [MapView: viewForAnnotation:] essere chiamato di nuovo e così la tua vista di annotazione verrà nuovamente creata (o forse riutilizzata se si utilizza dequeueReusableAnnotationViewWithIdentifier) ​​con dati corretti.

+0

ho finito per usare questa tecnica per il rinfresco di annotazioni singole – nurxyz

+0

I Sto provando a usare questo metodo e SO voglio che funzioni, ma non sembra comportarsi in modo affidabile a seconda del livello di zoom. A volte il pin appare troppo spostato a sinistra/destra, e il callout non è più allineati.(Questo è con immagini pin che hanno cambiamenti sottili ma sono comunque identiche nella composizione, con il pin "centro" al centro dell'immagine.) Hmm ... –

+0

Sì, ho dovuto aggiungere noiosamente annnotazioni di nuovo per aggiornarle. – coolcool1994

1

Questo ha funzionato per me

#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

(non vedo come per indicare che questo post si riferisce la risposta di al zerodiv.) Sono stato in grado di ottenere di zerodiv metodo per lavorare con l'aggiunta di un kickstart di sorta, costringendo una coordinata insignificante ma diversa, quindi ripristina quella precedente, corretta. Lo schermo non lampeggia affatto a causa della prima posizione.

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

mapView.centerCoordinate = forceChg; 
mapView.centerCoordinate = center; 
Problemi correlati