SwiftUI地图视图:长按转坐标及单双击手势冲突解决
SwiftUI Map手势冲突解决方案
一、长按手势导致地图无法拖动
添加自定义长按手势后,地图原生拖动功能失效,尝试simultaneousGesture也未解决问题。原代码采用长按+拖拽的序列手势,但未正确设置手势共存模式。
修复方案
将自定义手势包裹在simultaneousGesture中,确保地图原生拖动手势与自定义长按手势能同时被识别。调整后的手势逻辑如下:
struct ContentView: View { var body: some View { MapReader { reader in Map() .simultaneousGesture( LongPressGesture(minimumDuration: 1.0) .sequenced(before: DragGesture(minimumDistance: 0)) .onEnded { value in switch value { case .second(true, let drag): if let location = drag?.location, let pinLocation = reader.convert(location, from: .local) { UIImpactFeedbackGenerator(style: .rigid).impactOccurred() let lat = pinLocation.latitude let long = pinLocation.longitude // 在此处添加标记点逻辑 } default: break } } ) } } }
二、单双击手势冲突
双击地图时会同时触发原生放大功能和自定义单击手势,希望双击仅执行地图放大,单击仅获取坐标。尝试用延迟计数的方式过滤双击无效,快速双击仍会被识别为单击。
修复方案
通过highPriorityGesture让双击手势优先被识别,避免触发单击逻辑。代码示例:
struct ContentView: View { @State private var mapProxy: MapProxy? var body: some View { MapReader { proxy in Map() .onAppear { mapProxy = proxy } // 优先识别双击,交给系统处理放大 .highPriorityGesture( TapGesture(count: 2) .onEnded { /* 空实现,保留原生放大行为 */ } ) // 单击仅在未触发双击时执行 .onTapGesture(count: 1) { screenCoord in guard let loc = mapProxy?.convert(screenCoord, from: .local) else { return } // 处理单击获取坐标逻辑 print("标记点坐标:\(loc.latitude), \(loc.longitude)") } } } }
内容的提问来源于stack exchange,提问作者Ahmed Zaidan
相关产品推荐
相关产品推荐

