相当于 macOS 10.15 的地图结构?
Equivalent of map struct for macOS 10.15?
我一直在学习 Xcode (link) 的教程,直到我到达“MapView”部分,此时我被指示使用 Map(coordinateRegion: $region)
。我在 Mac Mini 上 运行ning 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)
我一直在学习 Xcode (link) 的教程,直到我到达“MapView”部分,此时我被指示使用 Map(coordinateRegion: $region)
。我在 Mac Mini 上 运行ning 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)