2011-01-17 33 views
14

He configurado un NSMutableArray de objetos derivados de una clase que se ajusta al protocolo MKAnnotation. Tengo título de configuración configuración y de subtítulos para la anotación y los he agregado con éxito a la MKMapView usando:MKMapView, animateDrop?

[[self customMapView] addAnnotations:locationArray]; 

Lo que quiero hacer ahora es animar los pasadores de caer, en un principio pensé que podía hacer eso con Option1 Usando esto todo funciona, pero los pines no hacen una caída animada.

// Option1 
// WORKS FOR: pinColor YES, animatesDrop NO, LABEL YES 
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    for(MKPinAnnotationView *eachView in views) { 
     [eachView setAnimatesDrop:YES]; 
     [eachView setPinColor:MKPinAnnotationColorPurple]; 
    } 
} 

Mi siguiente conjetura era intentar Option2, esto parece funcionar muy bien, pero tengo dos problemas. El título y los subtítulos no aparecen, mi objeto de anotación personalizado se transfiere (puedo verlo en el depurador) pero la información contenida no está llegando al nuevo pin. En segundo lugar, esto crea un nuevo conjunto de MKAnnotationViews, ¿qué pasa con los antiguos, están ahí y problemas con pérdidas de memoria?

// Option2 
//FOR: pinColor YES, animatesDrop YES, LABEL NO 
- (MKAnnotationView *) mapView: (MKMapView *) mapView viewForAnnotation: (id<MKAnnotation>) annotation { 
    MKPinAnnotationView *pin = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier: @"annotation_ID"]; 
    if (pin == nil) { 
     pin = [[[MKPinAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: @"annotation_ID"] autorelease]; 
    } else { 
     pin.annotation = annotation; 
    } 
    pin.pinColor = MKPinAnnotationColorRed; 
    pin.animatesDrop = YES; 
    return pin; 
} 

EDIT: He resuelto el título que falta & de subtítulos añadiendo pin.canShowCallout = YES;

+1

En el código de la opción 2, cuando se crea el pasador no va a tener el conjunto de anotación. Eliminaría el "else" y doraría pin.annotation = línea de anotación, para que siempre se establezca. – theLastNightTrain

Respuesta

32

MKPinAnnotationView es una subclase de MKAnnotationView.

MKAnnotationView es una vista de anotación genérica para la que debe proporcionar la imagen y la animación si lo desea.

MKPinAnnotationView es una conveniente subclase de MKAnnotationView que proporciona automáticamente una imagen de pin en un color seleccionado y una animación del pin que cae en el mapa. Establece la propiedad animatesDrop al crear la vista en viewForAnnotation y gestionará la animación automáticamente desde allí.

Si no implementa viewForAnnotation, se muestra un pin rojo estándar sin animación.

Cuando se llama a didAddAnnotationViews, la animación automática ya se ha producido y la configuración de esa propiedad no tiene ningún efecto.

Sin embargo, si desea crear una animación personalizada diferente de la animación por omisión que proporciona MKPinAnnotationView, puede hacerlo en didAddAnnotationViews. La vista ya estará en su punto de destino final, por lo que la guarda y luego la anima desde un punto diferente a ese destino.

Si está satisfecho con la animación por omisión que proporciona MKPinAnnotationView, no necesita implementar didAddAnnotationViews. Ese método delegado es más útil para hacer otras cosas que podría necesitar hacer cuando todas las vistas de anotación estén realmente en su lugar.

Para que sus pines muestren el título, establezca canShowCallout en YES donde establece animatesDrop.

No estoy seguro de lo que quiere decir con "esto crea un nuevo conjunto de MKAnnotationViews". En el método viewForAnnotation, está proporcionando una vista (MKPinAnnotationView) para el objeto MKAnnotation. No són la misma cosa.

Además, el método viewForAnnotation funciona como el método para cellForRowAtIndexPath UITableView donde anotación vistas puede conseguir reciclado, lo que es por eso que es importante para establecer la información MKAnnotation-específica en la vista cada vez que (como la propiedad de anotación).

+0

Gracias aBitObvoius, una respuesta perfecta. Con respecto a MKAnnotationViews me estaba confundiendo pensando que si no implementas viewForAnnotation (donde obtienes los pins rojos predeterminados) que quizás ya hubo una MKAnnotationView creada en algún lado y al implementarla posteriormente podría necesitar hacer algo con la antigua uno. – fuzzygoat

+0

Ok, al implementar viewForAnnotation, está anulando la vista predeterminada para que no haya duplicaciones. – Anna

+0

Entendido, muy apreciado, gracias de nuevo por una respuesta muy útil. – fuzzygoat

11

Aquí está la solución más simple que pude encontrar. Lo que hace es colocar un pin único en el evento UIMapView in viewDidLoad.

  1. El proyecto hace referencia MapKit marco

  2. La vista tienen la siguiente importación: #import <MapKit/MapKit.h>

  3. El controlador de vista implementa MKMapViewDelegate protocolo

  4. La implementación controlador de vista contiene:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id) annotation 
{ 
    MKPinAnnotationView *newAnnotation = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annotation1"]; 
    newAnnotation.pinColor = MKPinAnnotationColorGreen; 
    newAnnotation.animatesDrop = YES; 
    newAnnotation.canShowCallout = NO; 
    [newAnnotation setSelected:YES animated:YES]; 
    return newAnnotation; 
} 
  1. El viewDidLoad contiene:
CLLocationCoordinate2D geos = CLLocationCoordinate2DMake(0.2344, 45.324); 
MKPlacemark* marker = [[MKPlacemark alloc] initWithCoordinate:geos addressDictionary:nil]; 
[mapView addAnnotation:marker]; 
[marker release]; 
+1

En viewForAnnotation :, se supone que debes usar mapView.dequeueReusableAnnotationViewWithIdentifier, de la misma manera que usarías dequeueReusableCellWithIdentifier en un tableView. De lo contrario, sigues creando MKAnnotations con un identificador de reutilización que en realidad no reutilizas. –

+0

Selecciona una anotación dentro de viewForAnnotation que parece más bien sin sentido. – Andy

0

actualización Swift3:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 

    if annotation is MKUserLocation { 
    return nil 
    } 

    let pinAnnotation = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "PinAnnotation") 
    pinAnnotation.pinTintColor = .green; 
    pinAnnotation.animatesDrop = true; 
    pinAnnotation.canShowCallout = false; 
    pinAnnotation.setSelected(true, animated: true) 

    return pinAnnotation 
}