2009-11-07 15 views
29

Me gustaría cargar imágenes sincrónicamente para mi MKAnnotationView personalizado; Ya estoy usando EGOImageView-framework (va muy bien con UITableViews), pero no puedo hacerlo funcionar en MKMapView. Parece que las imágenes están cargadas, pero no puedo actualizarlas en el mapa: [myMap setNeedsDisplay] no hace nada.Actualizar MKAnnotationVer en un MKMapView

Respuesta

35

no he probado a mí mismo, pero podría funcionar:
obtener una vista de anotación utilizando MKMapView - (MKAnnotationView *)viewForAnnotation:(id <MKAnnotation>)annotation método y establecer nueva imagen a la misma.

Editar: tratado de hacer que yo y este enfoque funcionó bien para mí:

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

Después de llamar a este método todas las imágenes anotaciones fueron actualizados.

+0

Así es como se hace ahora. Pero de esta manera la imagen se carga sincrónicamente. – cocoapriest

+0

Y si lo llama después de que se cargue la imagen y establece esta imagen en la vista, ¿no funciona? – Vladimir

+0

esa es la pregunta: cómo configurar esta imagen más adelante. Al hacerlo, la imagen no se actualiza en MKAnnotationView – cocoapriest

2

Ésta es la única manera que he encontrado para forzar redibujado de MKAnnotationViews: actualización

// vigor de la vista de mapa (de lo contrario no serán vistas de anotación redibujar)

centro CLLocationCoordinate2D = mapView.centerCoordinate;

mapView.centerCoordinate = center;

Parece inútil, pero funciona.

+1

No, no es así. Acabo de intentar :( –

+0

funciona para mí! Gracias – nurxyz

+0

También funciona para mí ... – pnizzle

14

que ha encontrado un único método fiable para actualizar anotación, otros métodos no funcionan para mí: acaba de eliminar y añadir anotaciones de nuevo:

id <MKAnnotation> annotation; 

// ... 

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

Este código hará - [MAPview: viewForAnnotation:] estar llamado de nuevo y para que su vista de anotación se cree de nuevo (o tal vez reutilizada si usa dequeueReusableAnnotationViewWithIdentifier) ​​con los datos correctos.

+0

terminé usando esta técnica para refrescos de anotaciones simples – nurxyz

+0

I Estoy tratando de usar este método, y SO quiero que funcione, pero no parece comportarse de manera confiable dependiendo del nivel de zoom. A veces, el pin parece estar desplazado a la izquierda/derecha demasiado, y la llamada ya no es alineado.(Esto es con imágenes de pin que tienen cambios sutiles pero son idénticas en composición, con el pin 'centro' en el centro de la imagen.) Hmm ... –

+0

Sí, tuve que volver a agregar tediosamente Anotaciones nuevamente para actualizarlas. – coolcool1994

1

Esto funcionó para mí

#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

(no veo cómo indicar que este post se refiere a la zerodiv respuesta.) Yo era capaz de obtener de zerodiv método para trabajar mediante la adición de un arranque rápido de la clase, obligando una coordenada sin sentido pero diferente, luego restaurando la anterior, correcta. La pantalla no parpadea en absoluto debido a la primera ubicación.

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

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