tab sheet icon guidelines buttons bar ios swift mkmapview mkannotationview

sheet - menu ios



Pin personalizado de la imagen en anotaciónView en iOS (3)

Aquí está la respuesta:

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { let identifier = "MyPin" if annotation.isKindOfClass(MKUserLocation) { return nil } let detailButton: UIButton = UIButton(type: UIButtonType.DetailDisclosure) if let annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier) { annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "pin") annotationView.canShowCallout = true annotationView.image = UIImage(named: "custom_pin.png") annotationView.rightCalloutAccessoryView = detailButton } else { annotationView.annotation = annotation } return annotationView }

Saludos

Estoy intentando cambiar de Swift 1.2 a Swift 2.0 y estoy al final de los cambios. Actualmente estoy haciendo cambios en el MapViewController, y no hay ningún error o advertencia, pero la imagen personalizada para mi pin (annotationView) no está asignada al pin y muestra la imagen predeterminada (punto rojo).

Aquí está mi código, espero que pueda ayudarme con algún consejo porque creo que todo está bien pero aún no funciona:

func parseJsonData(data: NSData) -> [Farmacia] { let farmacias = [Farmacia]() do { let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary // Parse JSON data let jsonProductos = jsonResult?["farmacias"] as! [AnyObject] for jsonProducto in jsonProductos { let farmacia = Farmacia() farmacia.id = jsonProducto["id"] as! String farmacia.nombre = jsonProducto["nombre"] as! String farmacia.location = jsonProducto["location"] as! String let geoCoder = CLGeocoder() geoCoder.geocodeAddressString(farmacia.location, completionHandler: { placemarks, error in if error != nil { print(error) return } if placemarks != nil && placemarks!.count > 0 { let placemark = placemarks?[0] // Add Annotation let annotation = MKPointAnnotation() annotation.title = farmacia.nombre annotation.subtitle = farmacia.id annotation.coordinate = placemark!.location!.coordinate self.mapView.addAnnotation(annotation) } }) } } catch let parseError { print(parseError) } return farmacias } func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { let identifier = "MyPin" if annotation.isKindOfClass(MKUserLocation) { return nil } // Reuse the annotation if possible var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier) if annotationView == nil { annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) annotationView!.canShowCallout = true } annotationView!.image = UIImage(named: "custom_pin.png") let detailButton: UIButton = UIButton(type: UIButtonType.DetailDisclosure) annotationView!.rightCalloutAccessoryView = detailButton print(annotationView!.image) return annotationView }

Gracias por adelantado,

Saludos.


La respuesta aceptada no funciona, ya que tiene una annotationView Vista sin inicializar en el bloque else .

Aquí hay una mejor solución. Seque la vista de anotación si es posible o crea una nueva si no:

Swift 3, 4 :

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 } 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 }


SWIFT 3,4

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { if annotation.isKind(of: MKUserLocation.self) { return nil } let annotationIdentifier = "AnnotationIdentifier" var pinView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) if (pinView == nil) { pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier) } pinView?.canShowCallout = false return pinView }