2010-10-22 27 views
5

Me preguntaba si alguien sabe de alguna subclase para la clase MKAnnotationView. En la documentación de las manzanas, dicen que un ejemplo es el MKPinAnnotationView, por lo que me preguntaba si había otras subclases creadas previamente, como la que se utiliza para rastrear la ubicación actual de los dispositivos. Si alguien tiene consejos para crear mi propia subclase de la clase MKAnnotationView, también es bueno.Subclases de MKAnnotationView

Gracias, bubster

Respuesta

7

No conozco ningún otro plantillas, pero eso no significa que no existan. :)

De todos modos, aquí está cómo crear los personalizados: Crea una nueva clase conforme al protocolo MKAnnotation. Necesitará tener dos variables de instancia de tipo NSString* llamadas title y subtitle y una de tipo CLLocationCoordinate2D con una coordenada con nombre y un método de configuración apropiado (por ejemplo, propiedad). Esas cadenas se mostrarán en la llamada. En el delegado de su mapView, implemente el método -mapView:viewForAnnotation: de forma similar a como implementaría el origen de datos para una UITableView. Es decir, quitar una anotación de una vista mediante un identificador, establecer las nuevas propiedades (por ejemplo, un botón de tipo UIButtonTypeDetailDisclosure para la vista de accesorios derecha). Deberá agregar una imagen para mostrar debajo del desplazamiento. Simplemente use la propiedad image de su MKAnnotationView. El centro de la imagen personalizada de se colocará en la coordenadas que se especifican, por lo que es posible que desee dar un desplazamiento: aView.centerOffset = CGPointMake(0, -20)

Aquí hay un código de ejemplo:

- (MKAnnotationView *) mapView: (MKMapView *) mapView viewForAnnotation: (id<MKAnnotation>) annotation { 
    // reuse a view, if one exists 
    MKAnnotationView *aView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"pinView"]; 

    // create a new view else 
    if (!aView) { 
     aView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pinView"]; 
    } 

    // now configure the view 
    aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    [(UIButton*)aView.rightCalloutAccessoryView addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside]; 
    aView.canShowCallout = YES; 
    aView.enabled = YES; 
    aView.image = [UIImage imageNamed:@"green_pin.png"]; 
    aView.centerOffset = CGPointMake(0, -20); 

    return aView; 
} 
+0

Gracias por la ayuda. También me preguntaba si hay una forma de mover una anotación una vez que se ha colocado en el mapa. – bubster

+0

Simplemente configure la coordenada de su anotación al nuevo valor. MapView utiliza key-value-observing para ser notificado de cualquier cambio en sus anotaciones y hará el resto por usted. –

9

Por si alguien todavía está interesada en esto:

Usted puede obtener todas las subclases de una clase usando las funciones de tiempo de ejecución de Objective-C, tal como se describe aquí: http://cocoawithlove.com/2010/01/getting-subclasses-of-objective-c-class.html

Otras clases que heredan de MKAnnotationView son:

MKTransitCalloutView, MKAdAnnotationView, MKUserLocationView, MKUserLocationBreadCrumbView y MKPinAnnotationView

donde MKPinAnnotationView es el único que se documenta. Todos los demás son clases privadas que Apple usa internamente.