Swift diferentes imágenes para anotación

Logré obtener un icono personalizado para un pin de anotación en Swift, pero ahora todavía estoy atascado usando 2 imágenes diferentes para anotaciones diferentes. En este momento, un botón agrega una anotación al mapa. Debería haber otro botón que también agrega una anotación pero con otro ícono.

¿Hay alguna manera de usar el reuseId para esto?

class ViewController: UIViewController, MKMapViewDelegate { @IBOutlet weak var Map: MKMapView! @IBAction func btpressed(sender: AnyObject) { var lat:CLLocationDegrees = 40.748708 var long:CLLocationDegrees = -73.985643 var latDelta:CLLocationDegrees = 0.01 var longDelta:CLLocationDegrees = 0.01 var span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta) var location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat, long) var region:MKCoordinateRegion = MKCoordinateRegionMake(location, span) Map.setRegion(region, animated: true) var information = MKPointAnnotation() information.coordinate = location information.title = "Test Title!" information.subtitle = "Subtitle" Map.addAnnotation(information) } func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { if !(annotation is MKPointAnnotation) { return nil } let reuseId = "test" var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) if anView == nil { anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) anView.image = UIImage(named:"1.png") anView.canShowCallout = true } else { anView.annotation = annotation } return anView } 

En el método de delegado viewForAnnotation , configure la image función de la annotation la que se solicita el método.

Asegúrese de hacer esto después de que la vista se haya eliminado o creado (y no solo en la parte if anView == nil ). De lo contrario, las anotaciones que usan una vista eliminada mostrarán la imagen de la anotación que utilizó la vista anteriormente.

Con la MKPointAnnotation básica, una manera MKPointAnnotation de distinguir las anotaciones es por su title pero eso no es muy flexible.

Un mejor enfoque es usar una clase de anotación personalizada que implemente el protocolo MKAnnotation (una manera fácil de hacerlo es subclase MKPointAnnotation ) y agregar las propiedades necesarias para ayudar a implementar la lógica personalizada.

En la clase personalizada, agregue una propiedad, digamos imageName , que puede usar para personalizar la imagen según la anotación.

Este ejemplo subclases MKPointAnnotation :

 class CustomPointAnnotation: MKPointAnnotation { var imageName: String! } 

Cree anotaciones de tipo CustomPointAnnotation y establezca su imageName :

 var info1 = CustomPointAnnotation() info1.coordinate = CLLocationCoordinate2DMake(42, -84) info1.title = "Info1" info1.subtitle = "Subtitle" info1.imageName = "1.png" var info2 = CustomPointAnnotation() info2.coordinate = CLLocationCoordinate2DMake(32, -95) info2.title = "Info2" info2.subtitle = "Subtitle" info2.imageName = "2.png" 

En viewForAnnotation , use la propiedad imageName para establecer la image la vista:

 func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { if !(annotation is CustomPointAnnotation) { return nil } let reuseId = "test" var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) if anView == nil { anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) anView.canShowCallout = true } else { anView.annotation = annotation } //Set annotation-specific properties **AFTER** //the view is dequeued or created... let cpa = annotation as CustomPointAnnotation anView.image = UIImage(named:cpa.imageName) return anView } 

Código rápido de iOS con ayuda de Anna y Fabian Boulegue:

 import UIKit import MapKit class ViewController: UIViewController, MKMapViewDelegate { @IBOutlet weak var mapView: MKMapView! override func viewDidLoad() { super.viewDidLoad() self.mapView.delegate = self var info1 = CustomPointAnnotation() info1.coordinate = CLLocationCoordinate2DMake(26.889281, 75.836042) info1.title = "Info1" info1.subtitle = "Subtitle" info1.imageName = "flag.png" var info2 = CustomPointAnnotation() info2.coordinate = CLLocationCoordinate2DMake(26.862280, 75.815098) info2.title = "Info2" info2.subtitle = "Subtitle" info2.imageName = "flag.png" mapView.addAnnotation(info1) mapView.addAnnotation(info2) } func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { println("delegate called") if !(annotation is CustomPointAnnotation) { return nil } let reuseId = "test" var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) if anView == nil { anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId) anView.canShowCallout = true } else { anView.annotation = annotation } //Set annotation-specific properties **AFTER** //the view is dequeued or created... let cpa = annotation as CustomPointAnnotation anView.image = UIImage(named:cpa.imageName) return anView } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } class CustomPointAnnotation: MKPointAnnotation { var imageName: String! }