(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