You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI Map获取点击位置坐标是否有更简便的新版本实现方法?

SwiftUI 获取地图点击坐标的最简实现方案

iOS 17+ 原生实现(无需封装UIKit)

从iOS 17开始,SwiftUI新增的MapReader组件可以直接实现点击坐标转换,无需额外封装MKMapView,是目前最简便的实现方式。
实现逻辑:

  • 用MapReader获取地图代理对象,可直接将视图上的点击点位转换为地理坐标
  • 点击手势触发时,将拿到的坐标存入标注数组,即可自动渲染大头针
    完整示例代码:
import SwiftUI
import MapKit

struct MapTapDemoView: View {
    // 存储所有标注坐标
    @State private var annotations: [CLLocationCoordinate2D] = []
    // 地图初始区域,示例为北京天安门坐标
    @State private var region = MKCoordinateRegion(
        center: CLLocationCoordinate2D(latitude: 39.9042, longitude: 116.4074),
        span: MKCoordinateSpan(latitudeDelta: 0.1, longitudeDelta: 0.1)
    )
    
    var body: some View {
        MapReader { proxy in
            Map(coordinateRegion: $region, annotationItems: annotations) { coord in
                MapPin(coordinate: coord)
            }
            .onTapGesture { tapPoint in
                // 把视图点击点转换成地理坐标
                guard let tapCoordinate = proxy.convert(tapPoint, from: .local) else { return }
                annotations.append(tapCoordinate)
            }
        }
        .ignoresSafeArea()
    }
}

// 给CLLocationCoordinate2D加Identifiable适配Map的annotationItems要求
extension CLLocationCoordinate2D: Identifiable {
    public var id: String {
        "\(latitude)-\(longitude)"
    }
}

iOS 16及更低版本兼容方案

如果需要适配旧系统,需要通过UIViewRepresentable封装MKMapView,给MKMapView添加点击手势识别器,在手势回调中调用MKMapView的convert(_ point: CGPoint, toCoordinateFrom view: UIView?)方法得到点击坐标,再通过闭包回调给SwiftUI层使用即可。

实现效果

样例示意图

内容的提问来源于stack exchange,提问作者degermon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:36:06