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
相关产品推荐
相关产品推荐

