如何将点击手势转换为 SwiftUI 地图视图中的坐标?

Ale*_*ddi 18 mapkit swiftui

我正在尝试将一个MapAnnotation项目添加到我的Map()视图中MapKit

如果您在文本字段中手动添加坐标,则一切正常,但我找不到任何通过点击地图来添加坐标的方法。

我在互联网上阅读了很多内容,但没有找到任何有关onTap()地图事件处理的信息。

这是我到目前为止的地图视图的样子:

struct MyMap : View {
    
    @State private var myRegion:MKCoordinateRegion = {
        var newRegion = MKCoordinateRegion()
        newRegion.center.latitude = 53.7576508
        newRegion.center.longitude = -11.1811597
        newRegion.span.latitudeDelta = 0.1
        newRegion.span.longitudeDelta = 0.1
        
        return newRegion
    }()
    
    
    @State private var annotationItems : [Annotation] = [
        Annotation(name: "Pin1", description: "myDescription", coordinate: CLLocationCoordinate2D(latitude: 123.7576508, longitude: -7.2373215))
    ]
    
    var body: some View {
        
        ZStack {
            Map(coordinateRegion: self.$myRegion, interactionModes: .all, annotationItems: annotationItems){ item in
                MapAnnotation(coordinate: item.coordinate){
                    PinView(pin: item)
                }
                
            }
            .edgesIgnoringSafeArea(.all)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以获取用户在地图上点击的位置的坐标吗?

Jam*_*mey 10

iOS 17 现在有一个用于 SwiftUI 地图的 MapReader。你可以像这样包装 Map:

struct ContentView: View {
    var body: some View {
        MapReader { reader in
            Map()
            .onTapGesture(perform: { screenCoord in
                let pinLocation = reader.convert(screenCoord, from: .local)
                print(pinLocation)
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以提取触摸的纬度/经度。

  • 谢谢詹姆斯,工作很有魅力。这应该是 iOS >= 17 可接受的答案。 (2认同)

bso*_*sod 2

您可以做的是将点击手势识别器添加到地图,然后将触摸点转换为识别器处理程序中的坐标:

@objc func tapMapAction(recognizer: UITapGestureRecognizer) {
    let touch = recognizer.location(in: mapView)
    let coord = mapView.convert(touch, toCoordinateFrom: mapView)

    let annot = MKPointAnnotation()
    annot.coordinate = coord
    mapView.addAnnotation(annot)
}
Run Code Online (Sandbox Code Playgroud)

应某人要求,我已取消删除此答案;另外,考虑到 SwiftUI 中没有公认的答案,并且 UIKit 仍然是当今生产应用程序的主导框架。

  • 是的,但是 SwiftUI 不是 UIKit (2认同)