如何解决等效于 macOS 10.15 的地图结构?
我一直在学习有关 Xcode (link) 的教程,直到进入“MapView”部分,此时我被指示使用 Map(coordinateRegion: $region)
。我在 Mac Mini 上运行 Xcode 12.4,它只能运行到 macOS 10.15,所以我收到错误 'Map' is only available in macOS 11.0 or newer
。我尝试浏览 Apple 文档以获取我的 MacOS 版本的等效代码,但找不到任何内容。我可以使用什么等效代码来完成本教程的这一部分?
完整示例代码:
import SwiftUI
import MapKit
struct MapView: View {
@State private var region = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: 34.011_286,longitude: -116.166_868),span: MKCoordinateSpan(latitudeDelta: 0.2,longitudeDelta: 0.2)
)
var body: some View {
Map(coordinateRegion: $region)
}
}
struct MapView_Previews: PreviewProvider {
static var previews: some View {
MapView()
}
}
解决方法
您需要将 MKMapView
包裹在 NSViewRepresentable
中。
以下是一个准系统表示。请注意,SwiftUI 2.0 Map
可以执行更多操作,但这会让您开始使用您显示的示例代码:
struct MapView: View {
@State private var region = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: 34.011_286,longitude: -116.166_868),span: MKCoordinateSpan(latitudeDelta: 0.2,longitudeDelta: 0.2)
)
var body: some View {
MapCompat(coordinateRegion: $region)
}
}
struct MapCompat : NSViewRepresentable {
@Binding var coordinateRegion : MKCoordinateRegion
func makeNSView(context: Context) -> MKMapView {
let mapView = MKMapView()
mapView.delegate = context.coordinator
return mapView
}
func updateNSView(_ view: MKMapView,context: Context) {
view.region = coordinateRegion
}
func makeCoordinator() -> Coordinator {
return Coordinator(self)
}
class Coordinator : NSObject,MKMapViewDelegate {
var parent : MapCompat
init(_ parent: MapCompat) {
self.parent = parent
}
func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) {
DispatchQueue.main.async {
self.parent.coordinateRegion = mapView.region
}
}
}
}
更新以修复我最初的错误,即 UIKit (UIViewRepresentable) 等价于这个而不是 AppKit (NSViewRepresentable)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。