MKMapView: en lugar de Annotation Pin, una vista personalizada

Quiero mostrar una imagen en mi MKMapView lugar de un pequeño pin de rock . ¿Puede alguien poner aquí un código útil o indicar la forma de hacerlo?

¡Gracias!

EDITAR

 -(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation: (id )annotation { MKPinAnnotationView *pinView = nil; if(annotation != mapView.userLocation) { static NSString *defaultPinID = @"com.invasivecode.pin"; pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; if ( pinView == nil ) pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID]; pinView.pinColor = MKPinAnnotationColorGreen; pinView.canShowCallout = YES; pinView.animatesDrop = YES; pinView.image = [UIImage imageNamed:@"pinks.jpg"]; //as suggested by Squatch } else { [mapView.userLocation setTitle:@"I am here"]; } return pinView; } 

Estoy esperando que mi imagen pinks.jpg esté en el mapa, fijando la ubicación en lugar de la vista de alfiler por defecto (en forma de alfiler de roca ). Pero aún estoy obteniendo la imagen predeterminada del pin.

Cuando desee usar su propia imagen para una vista de anotación, debe crear una MKAnnotationView lugar de una MKPinAnnotationView .

MKPinAnnotationView es una subclase de MKAnnotationView por lo que tiene una propiedad de image , pero generalmente la anula y dibuja una imagen de pin (para eso MKAnnotationView ).

Así que cambie el código a:

 -(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id )annotation { MKAnnotationView *pinView = nil; if(annotation != mapView.userLocation) { static NSString *defaultPinID = @"com.invasivecode.pin"; pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; if ( pinView == nil ) pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID]; //pinView.pinColor = MKPinAnnotationColorGreen; pinView.canShowCallout = YES; //pinView.animatesDrop = YES; pinView.image = [UIImage imageNamed:@"pinks.jpg"]; //as suggested by Squatch } else { [mapView.userLocation setTitle:@"I am here"]; } return pinView; } 

Observe que animatesDrop también está comentado, ya que esa propiedad solo existe en MKPinAnnotationView .

Si aún desea que caigan las anotaciones de su imagen, tendrá que hacer la animación usted mismo. Puede buscar Stack Overflow para “animatesdrop mkannotationview” y encontrará varias respuestas. Aquí están los primeros dos:

  • ¿Es posible invocar animatesDrop en MKAnnotationView en lugar de MKPinAnnotationView?
  • ¿Cómo puedo crear una animación personalizada “pin-drop” usando MKAnnotationView?

Aquí hay una respuesta en Swift 3 . Dequeue vista de anotación si es posible o crea una nueva si no es así:

 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { // Don't want to show a custom image if the annotation is the user's location. guard !(annotation is MKUserLocation) else { return nil } // Better to make this class property let annotationIdentifier = "AnnotationIdentifier" var annotationView: MKAnnotationView? if let dequeuedAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) { annotationView = dequeuedAnnotationView annotationView?.annotation = annotation } else { annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier) annotationView?.rightCalloutAccessoryView = UIButton(type: .detailDisclosure) } if let annotationView = annotationView { // Configure your annotation view here annotationView.canShowCallout = true annotationView.image = UIImage(named: "yourImage") } return annotationView } 

Swift 2.2 :

 func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { // Don't want to show a custom image if the annotation is the user's location. guard !annotation.isKindOfClass(MKUserLocation) else { return nil } // Better to make this class property let annotationIdentifier = "AnnotationIdentifier" var annotationView: MKAnnotationView? if let dequeuedAnnotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(annotationIdentifier) { annotationView = dequeuedAnnotationView annotationView?.annotation = annotation } else { let av = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier) av.rightCalloutAccessoryView = UIButton(type: .DetailDisclosure) annotationView = av } if let annotationView = annotationView { // Configure your annotation view here annotationView.canShowCallout = true annotationView.image = UIImage(named: "yourImage") } return annotationView } 

Estoy de acuerdo con la respuesta de Anna y me gusta mostrar cómo se verá eso en swift3 . Esta respuesta es con muchas otras opciones . Como cambiar el tamaño de la imagen, obtener una lista de imágenes de array y ect.

 func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { if let annotation = annotation as? PetrolStation { let identifier = "pinAnnotation" var view: MKAnnotationView if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKPinAnnotationView { // 2 dequeuedView.annotation = annotation view = dequeuedView } else { // 3 view = MKAnnotationView(annotation: annotation, reuseIdentifier: identifier) view.canShowCallout = true //here We put a coordinates where we like to show bubble with text information up on the pin image view.calloutOffset = CGPoint(x: -7, y: 7) //Here this is a array of images let pinImage = PetrolItem[activePlace].imgPetrol?[activePlace] //Here we set the resize of the image let size = CGSize(width: 30, height: 30) UIGraphicsBeginImageContext(size) pinImage?.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height)) let resizeImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() view.image = resizeImage //Here we like to put into bubble window a singe for detail Informations view.rightCalloutAccessoryView = UIButton(type: .detailDisclosure) as UIView //Here we make change of standard pin image with our image view.image = resizeImage } return view } return nil }