关于swift:已添加(SwiftUI)MKOverlays(从GeoJSON解析),但未显示在屏幕上,我是否丢失了某些内容?

(SwiftUI) MKOverlays (parsed from GeoJSON) are added, but do not show on screen, am I missing something?

我试图在SwiftUI中显示UIKit / MapKit视图,遵循与Github上的该项目非常相似的代码,但从Apple指南实施GeoJSON渲染/覆盖代码,以使用过滤和相机约束优化地图视图。

我有一个'EventDataSource'类,该类(成功地)从UIViewRepresentable类中的本地文件中解析GeoJSON对象,然后加载此数据,并在updateUIView函数中添加叠加层。

在mapView(_ mapView:MKMapView,rendererFor overlay:MKOverlay)函数中放置一个断点显示每个多边形的_pointCount值正确,并且我为坐标添加了print()行,该行成功打印出了所有坐标每次加载视图时,这些对象。

Xcode不会显示任何错误并且构建良好,运行时加载MapKit视图,但屏幕上没有覆盖层。

在UIKit ViewController中使用的完全相同的mapView(_ mapView:MKMapView,rendererFor overlay:MKOverlay)函数完美地呈现了对象。在SwiftUI中,我获得了成功的解析,但只有一个空的映射。我有什么想念的吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import SwiftUI
import MapKit

struct MapView: UIViewRepresentable {
    var dataSource: EventDataSource = EventDataSource()

    func makeUIView(context: Context) -> MKMapView {
        let map = MKMapView()
        map.delegate = context.coordinator
        return map
    }

    func updateUIView(_ mapView: MKMapView, context: Context) {
        mapView.region = .event

        mapView.addOverlays(dataSource.overlays)
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

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

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

        func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

            if let polygon = overlay as? MKPolygon {
                let renderer = MKPolygonRenderer(polygon: polygon)
                renderer.fillColor = UIColor(named:"OverlayFill")
                renderer.strokeColor = UIColor(named:"OverlayStroke")
                renderer.lineWidth = 1.0
                print("\\(polygon.coordinate.longitude), \\(polygon.coordinate.latitude)") // succesfully prints the coordinate of each object
                return renderer
            }
            else if let multiPolygon = overlay as? MKMultiPolygon {
                let renderer = MKMultiPolygonRenderer(multiPolygon: multiPolygon)
                renderer.fillColor = UIColor(named:"OverlayFill")
                renderer.strokeColor = UIColor(named:"OverlayStroke")
                renderer.lineWidth = 1.0
                print("\\(multiPolygon.coordinate.longitude), \\(multiPolygon.coordinate.latitude)") // succesfully prints the coordinate of each object
                return renderer
            }
            return MKOverlayRenderer(overlay: overlay)
        }
}

}

我尝试注释掉该行

1
mapView.addOverlays(dataSource.overlays)

当该行不存在时,坐标不会打印到控制台,因此我确定函数已被调用。

任何帮助将不胜感激,谢谢!


如果你尝试这个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import SwiftUI
import MapKit

struct MapView: UIViewRepresentable {
    var coordinate: CLLocationCoordinate2D

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

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

        let span = MKCoordinateSpan(latitudeDelta: 2.0, longitudeDelta: 2.0)
        let region = MKCoordinateRegion(center: coordinate, span: span)
        view.setRegion(region, animated: true)
    }
}

然后在您的视图中添加

1
MapView(coordinate:"the coordinates")

签出
https://developer.apple.com/tutorials/swiftui/creating-and-combining-views