MKMapView: en lugar del pin de anotación, una vista personalizada

Quiero mostrar una image en mi MKMapView lugar de pin pequeño. ¿Puede alguien poner un código útil aquí o decirle cómo hacerlo?

¡Gracias!

EDITAR

 -(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation: (id <MKAnnotation>)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; } 

Espero que mi image pinks.jpg esté en el map, fijando la location en lugar de la vista pnetworkingeterminada del pin (en forma de pin rock ). Pero aún así obtengo la image pnetworkingeterminada del pin.

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

MKPinAnnotationView es una subclass de MKAnnotationView por lo que tiene una propiedad de image pero generalmente anula eso y dibuja una image de pin (de eso se trata).

Entonces, cambia el código para:

 -(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)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 se comentó ya que esa propiedad solo existe en MKPinAnnotationView .

Si aún deseas que se borren las annotations de la image, tendrás que hacer la animation tú mismo. Puede search Stack Overflow para "animatesdrop mkannotationview" y encontrará varias respuestas. Aquí están los dos primeros:

  • ¿Es posible llamar a animatesDrop en un MKAnnotationView en lugar de MKPinAnnotationView?
  • ¿Cómo puedo crear una animation "pin-drop" personalizada usando MKAnnotationView?

Aquí hay una respuesta sobre Swift 3 . Elimina la 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 gustaría mostrar cómo se verá en swift3 . Esta respuesta es con muchas otras opciones . Como cambiar el tamaño de la image, obtenga una list 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 }