ios swift mkmapview mkannotationview mkpointannotation

ios - Swift diferentes imágenes para anotación



mkmapview mkannotationview (2)

Código Swift de iOS con la 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! }

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

¿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 delegado viewForAnnotation , establezca 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 en cola mostrarán la imagen de la anotación que utilizó la vista anteriormente.

Con la MKPointAnnotation básica, una forma cruda 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 forma fácil de hacerlo es subclasificar 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 en función de 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 }