swiftUI中未显示折线

问题描述 投票:0回答:1

大家好,我已经工作了几天,在地图上显示一条直线。我使用swiftUImapkit渲染map。我要实现的是两个注释之间的一个straight line,这些注释显示在map上。

Dit is de code die ik op dit moment heb。 Ik hoop dut jullie mij kunnen helpen想要ik kom er niet uit。

import MapKit

struct MapViewWorldDetail: UIViewRepresentable {

    var StartCoordinate: CLLocationCoordinate2D
    var EndCoordinate: CLLocationCoordinate2D
    var name: String
    @Binding var region: CLLocationCoordinate2D

    func makeUIView(context: Context) -> MKMapView {
        MKMapView(frame: .zero)
    }

    func updateUIView(_ view: MKMapView, context: Context) {

        let span = MKCoordinateSpan(latitudeDelta: 50, longitudeDelta: 50)
        let region = MKCoordinateRegion(center: self.region, span: span)
//      view.mapType = MKMapType.satelliteFlyover;
        view.setRegion(region, animated: true)

        let annotation = MKPointAnnotation()
        annotation.coordinate = StartCoordinate
        annotation.title = name
        view.addAnnotation(annotation)

        let annotationEnd = MKPointAnnotation()
        annotationEnd.coordinate = EndCoordinate
        annotationEnd.title = name
        view.addAnnotation(annotationEnd)

        let aPolyline = MKGeodesicPolyline(coordinates: [StartCoordinate, EndCoordinate], count: 2)
        view.addOverlay(aPolyline)
    }
}
ios swift swiftui mapkit
1个回答
0
投票

正在绘制的直线线上的注释:您正在使用MKGeodesicPolyline绘制的线在Apple开发人员文档中具有此注释:

[MKGeodesicPolyline-在二维地图视图上显示时,任意两点之间的线段可能看起来是弯曲的。


工作代码示例

working sample of MapKit


在SwiftUI中,您需要在MKMapViewDelegate类中实现Coordinator,该类负责处理Overlay:

  1. 将此添加到func updateUIView
    func updateUIView(_ view: MKMapView, context: UIViewRepresentableContext<MapView>) {

      // Stuff you already had in updateUIView
      // :
      // adding this at the end is sufficient
      mapView.delegate = context.coordinator
    }
  1. 将此添加到您的结构struct MapViewWorldDetail
    // MARK: - Coordinator for using UIKit inside SwiftUI.
    func makeCoordinator() -> MapView.Coordinator {
        Coordinator(self)
    }

    final class Coordinator: NSObject, MKMapViewDelegate {
        var control: MapView

        init(_ control: MapView) {
            self.control = control
        }

        // MARK: - Managing the Display of Overlays

        func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
            print("mapView(_:rendererFor:)")
            if let polyline = overlay as? MKPolyline {

                let polylineRenderer = MKPolylineRenderer(overlay: polyline)
                polylineRenderer.strokeColor = .red
                polylineRenderer.lineWidth = 3
                return polylineRenderer
            }

            return MKOverlayRenderer(overlay: overlay)
        }
    }


很好的参考文献:

© www.soinside.com 2019 - 2024. All rights reserved.