如何将 Mapbox SDK 与 SwiftUI 集成

How to integrate Mapbox SDK with SwiftUI

我在我的项目中安装了 Mapbox SDK,但我不明白如何将此代码片段与 SwiftUI 集成。

我创建了一个名为 MapView 的 SwiftUI View,我在其中导入了 Mapbox Framework。

我尝试使用 UIViewRepresentable 协议,就像 Apple 的教程一样,但没有成功。

import Mapbox

class MapView: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()

    let styleURL = URL(string: "mapbox://styles/mapbox/outdoors-v9")
    let mapView = MGLMapView(frame: view.bounds,
                             styleURL: styleURL)
    mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    mapView.setCenter(CLLocationCoordinate2D(latitude: 45.52954,
                                             longitude: -122.72317),
                      zoomLevel: 14, 
                      animated: false)
    view.addSubview(mapView)
  }

}

我是 iOS 开发的新手,如有任何帮助,我们将不胜感激。

这是一个关于如何将 MGLMapViewSwiftUI 集成的工作示例。

使用 UIViewRepresentable 时,您必须实现两个委托:makeUIView 将 return 您的视图(在本例中为 MGLMapView)和 updateUIView将收到与在 makeUIView 中编辑的 return 相同的视图类型(再次 MGLMapView)。

你可以用它来做实验。

此外,我建议您熟悉 React 架构,以便更好地理解 SwiftUI 方法。

您可以通过使 ContentView 接收样式 URL 并在预览中尝试不同的样式来改进此示例。

import Mapbox
import SwiftUI

struct ContentView : View {
    var body: some View {

        MapboxViewRepresentation(MGLStyle.streetsStyleURL)

    }
}

#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

struct MapboxViewRepresentation : UIViewRepresentable {

    let styleURL: URL

    init(_ styleURL: URL) {
        self.styleURL = styleURL
    }

    func makeUIView(context: UIViewRepresentableContext<MapboxViewRepresentation>) -> MGLMapView {
        let mapView = MGLMapView(frame: .zero, styleURL: styleURL)

        return mapView
    }

    func updateUIView(_ uiView: MGLMapView, context: UIViewRepresentableContext<MapboxViewRepresentation>) {

    }


}

更新:这是关于如何将 Mapbox 与 SwiftUI 集成的官方指南 https://docs.mapbox.com/help/tutorials/ios-swiftui/