微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

等效于 macOS 10.15 的地图结构?

如何解决等效于 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 举报,一经查实,本站将立刻删除。