SwiftUI按钮与地图交互

4

我完全不熟悉Swift和SwiftUI,但是在一个项目组中,我需要开发我的第一个iOS应用程序。

我可以使用Mapbox显示地图,但我不知道如何在单击按钮时跟踪我的用户。

我不知道如何将我的按钮与我的结构MapView互动。

以下是我的代码:

MapView.swift:

import Mapbox

struct MapView: UIViewRepresentable {

    let mapView: MGLMapView = MGLMapView(frame: .zero)

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    
    func makeUIView(context: UIViewRepresentableContext<MapView>) -> MGLMapView {
        mapView.delegate = context.coordinator
        return mapView
    }
    
    func updateUIView(_ uiView: MGLMapView, context: UIViewRepresentableContext<MapView>) {
        
    }
    
    func styleURL(_ styleURL: URL) -> MapView {
        mapView.styleURL = styleURL
        return self
    }
    
    func centerCoordinate(_ centerCoordinate: CLLocationCoordinate2D) -> MapView {
        mapView.centerCoordinate = centerCoordinate
        return self
    }
    
    func zoomLevel(_ zoomLevel: Double) -> MapView {
        mapView.zoomLevel = zoomLevel
        return self
    }
    
    func userTrackingMode(_ userTrackingMode: MGLUserTrackingMode) -> MapView {
        mapView.userTrackingMode = userTrackingMode
        return self
    }
}

class Coordinator: NSObject, MGLMapViewDelegate {
    var parent: MapView
    
    init(_ parent: MapView) {
        self.parent = parent
    }
}

ContentView.swift:

import Mapbox

struct ContentView: View {
    
    @Environment(\.colorScheme) var colorScheme: ColorScheme
    
    var body: some View {
        ZStack {
            MapView()
                .userTrackingMode(.follow)
                .edgesIgnoringSafeArea(.all)
            HStack(alignment: .top) {
                Spacer()
                VStack() {
                    Button(action: {
                        //ACTION TO CHANGE FOLLOW MODE
                    }) {
                        Image(systemName: "location.fill")
                            .frame(width: 40.0, height: 40.0)
                    }
                    .padding(.top, 60.0)
                    .padding(.trailing, 10.0)
                    .frame(width: 45.0, height: 80.0)
                    Spacer()
                }
                
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environment(\.colorScheme, .dark)
    }
}
1个回答

4

实际上,在您的情况下,由于您有一个map引用,因此您可以直接进行交互(即命令式地进行交互,因为它本质上是这样的,所以没有必要把简单的事情搞得复杂)

例如:

...

let myMapHolder = MapView()
var body: some View {
    ZStack {
        myMapHolder
            .userTrackingMode(.follow)
            .edgesIgnoringSafeArea(.all)
    ...



       VStack() {
            Button(action: {
                self.myMapHolder.mapView.userTrackingMode = _your_mode_
            }) {
                Image(systemName: "location.fill")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接