我有一个SwiftUI MapKitView,它遵循https://www.hackingwithswift.com/books/ios-swiftui/advanced-mkmapview-with-swiftui中的模式,适用于macOS。在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)
}在返回setRegion()时,mapView.region似乎并未实际更新
问题是我想要调整地图的方向,而不是正北方向,所以我必须设置一个摄像头。
但是,creating MKMapCamera中的fromDistance:参数必须根据设置的区域计算,但是设置区域后,相机的视场角度是多少,才能确定包含窗口的正确范围需要多高?我基本上想通过fittedRegion设置相同的变焦级别,并希望在相机中复制更改后的方向(间距为0)。
看起来MKMapViewDelegate有一个mapViewDidChangeVisibleRegion,我想协调员就是SwiftUI中的代表。我可以在多个对updateNSView的调用中看到该区域,尽管它在实际设置之前需要几次调用。我怀疑在那里设置摄像头会创建另一个updateNSView()调用,这会带来问题。
我如何调整地图的方向,使其包括给定的区域范围,而不考虑窗口大小、缩放级别和初始加载方向(然后让用户按自己认为合适的方式进行操作)。
发布于 2020-06-15 14:35:15
请尝试以下操作
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-15 14:55:08
我想我想通了。
在协调器中响应func mapViewDidFinishLoadingMap(_ mapView: MKMapView)并将mapView.camera.heading设置为适当的值,这是我想要做的事情。
https://stackoverflow.com/questions/62382226
复制相似问题