1

我有一个 SwiftUI MapKitView,它遵循适用于 macOS的https://www.hackingwithswift.com/books/ios-swiftui/advanced-mkmapview-with-swiftui中的模式。makeNSView我为要显示的位置的有趣位设置区域时,与窗口大小无关,并且默认情况下,无论 NSWindow 是横向多于纵向还是相反,我都可以使此代码适当地缩放。

 func makeNSView(context: Context) -> MKMapView {
    let mapView = MKMapView()
    mapView.delegate = context.coordinator
    mapView.mapType = .satellite
    mapView.pointOfInterestFilter = .excludingAll
    let region = MKCoordinateRegion(center: centroid, latitudinalMeters: 1160, longitudinalMeters: 1260)
    let fittedRegion = mapView.regionThatFits(region)
    mapView.setRegion(fittedRegion, animated: false)
}

似乎mapView.region在返回时实际上并没有更新setRegion()

问题是我想定位地图而不是真正的北方,所以我必须设置一个相机。

但是,fromDistance:创建 MKMapCamera 的参数必须根据设置的区域计算,但是一旦设置了区域,相机的视场角是多少才能确定包含正确范围的窗口需要多高?我基本上希望缩放级别设置与通过相同,fittedRegion并希望在相机中复制具有更改标题的缩放级别(间距为 0)

似乎MKMapViewDelegate有一个mapViewDidChangeVisibleRegion,我认为 Coordinator 是 SwiftUI 中的代表。我可以在多次调用时看到该区域updateNSView,但在实际设置之前需要进行几次调用。我怀疑将相机设置在那里会产生另一个updateNSView()会造成问题的呼叫。

如何定位地图以包含给定区域范围,而不管窗口大小与初始加载时的缩放级别和标题(但随后让用户按照他们认为合适的方式进行操作)..

4

2 回答 2

0

我想我想通了。

func mapViewDidFinishLoadingMap(_ mapView: MKMapView)在协调器中响应并将 设置mapView.camera.heading为适当的值可以满足我的意图。

于 2020-06-15T06:55:07.623 回答
0

尝试以下

func makeNSView(context: Context) -> MKMapView {
    let mapView = MKMapView()
    mapView.delegate = context.coordinator
    mapView.mapType = .satellite
    mapView.pointOfInterestFilter = .excludingAll
    let region = MKCoordinateRegion(center: centroid, latitudinalMeters: 1160, longitudinalMeters: 1260)
    let fittedRegion = mapView.regionThatFits(region)

    DispatchQueue.main.async {
       mapView.setRegion(fittedRegion, animated: false)
    }
    return mapView
}
于 2020-06-15T06:35:14.600 回答