annotation iphone ios ipad mkmapview mkannotationview

iphone - Personalice la leyenda MKAnnotationView



add annotation mapkit swift (2)

Quiero crear una llamada MKAnnotationView personalizada como se muestra en esta imagen. He probado varias soluciones, pero solo permiten la personalización de las imágenes izquierda / derecha y el título / subtítulo. ¿Alguien puede darme algún código fuente o enlace tutorial para ello?

Actualmente no tengo idea. Por favor ayuda.


Agregué UIButton personalizado en MKAnnotationView. Y al hacer clic en ese botón, he mostrado popOver con rootViewController con la vista similar a la que se muestra arriba.


Entiendo que quieres un pin con un rótulo personalizado.

No podemos crear un texto personalizado, pero podemos crear una anotación con una vista completamente personalizada. Entonces, el truco es agregar una segunda anotación cuando se selecciona la primera, y hacer que la vista de la segunda anotación parezca una burbuja de llamada.

Esta es la solución publicada por los usuarios djibouti33 y jacob-jennings en la respuesta: MKAnnotationView : bloquea la vista de anotación personalizada para fijar las actualizaciones de ubicación , que a su vez se basa en una publicación de blog de Asynchrony Solutions. A modo de explicación, aquí hay algunos UML de un proyecto bifurcado:

Este es un gran truco, pero también la forma más limpia que he visto para implementar anotaciones personalizadas.

Comience con una clase de "Contenido" de NSObject que tenga una coordenada, la clase de la vista de leyenda a utilizar (en el UML es AnnotationView, pero puede crear más y configurarlas aquí), y un diccionario de valores aleatorios con el título, foto url, etc. Utilice esta clase para inicializar un objeto MKAnnotation "Annotation".

#import <MapKit/MapKit.h> @interface Content : NSObject @property (nonatomic,assign) CLLocationCoordinate2D coordinate; // ... @interface Annotation : NSObject <MKAnnotation, AnnotationProtocol> -(id) initWithContent:(Content*)content; // ...

La Anotación implementa AnnotationProtocol para anunciar que quiere manejar la creación de su propio MKAnnotationView. Es decir, su MKMapViewDelegate debe tener un código como este:

- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id<MKAnnotation>)annotation { // if this is a custom annotation, delegate the implementation of the view if ([annotation conformsToProtocol:@protocol(AnnotationProtocol)]) { return [((NSObject<AnnotationProtocol>*)annotation) annotationViewInMap:mapView]; } else { // else, return a standard annotation view // ... } }

La vista devuelta será de tipo AnnotationView, que implementa AnnotationViewProtocol para anunciar que desea controlar la selección / deselección. Por lo tanto, en su controlador de vista de mapa, los métodos mapView: didSelectAnnotationView: y mapView: didDeselectAnnotationView: deberían delegar de forma similar a lo que vimos anteriormente.

Cuando se selecciona la anotación, se agrega una segunda anotación (CalloutAnnotation), que sigue el mismo comportamiento, pero esta vez la vista devuelta (CalloutView) se inicializa desde un XIB y contiene el código Core Graphics (en BaseCalloutView) para animar y replicar un gritar.

El inicializador de la clase CalloutView:

- (id)initWithAnnotation:(CalloutAnnotation*)annotation { NSString *identifier = NSStringFromClass([self class]); self = [super initWithAnnotation:annotation reuseIdentifier:identifier]; if (self!=nil){ [[NSBundle mainBundle] loadNibNamed:identifier owner:self options:nil]; // prevent the tap and double tap from reaching views underneath UITapGestureRecognizer *tapGestureRecognizer = ... } return self; }

Para poder presionar otro controlador de vista desde la vista de llamadas utilicé notificaciones.

La respuesta SO que vinculé en la parte superior contiene dos proyectos completos que implementan este código (los nombres de las clases pueden diferir). Tengo otro proyecto usando el UML arriba en https://github.com/j4n0/callout .