iOS中的annotationView中的自定义图钉图像
我试图从Swift 1.2更改为Swift 2.0,而且我正在进行更改。 目前我正在MapViewController中进行更改,并没有任何错误或警告,但我的引脚(annotationView)自定义图像没有分配到引脚,它显示默认的(红点)。
这里是我的代码,我希望你能帮助我一些提示,因为我觉得一切都很好,但它仍然不工作:
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 }
提前致谢,
问候。
接受的答案不起作用,因为它具有在else
块中未初始化的annotationView
。
这是一个更好的解决scheme。 如果可能的话,它会使注解视图出列,否则创build一个新视图:
斯威夫特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 }
答案是:
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 }
问候
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 }