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

Swift3下基于Google Maps iOS SDK实现长按GMSMarker打印坐标的问题

解决Google Maps iOS SDK长按GMSMarker打印坐标的问题

哎,你之前把长按函数放在placeMapMarkers里的思路确实有点小问题哦~因为长按是用户和地图的交互事件,不是创建marker的时候就能绑定识别的,得换个方式来实现。我给你整理了靠谱的步骤,照着来就行:

第一步:先把所有marker存起来,方便后续识别

你从字典取坐标创建marker的时候,别创建完就丢了,得把它们放到一个全局数组里存着,这样后面长按的时候才能找到对应的marker。比如:

// 在ViewController里定义一个全局数组
var mapMarkers: [GMSMarker] = []

func placeMapMarkers() {
    mapMarkers.removeAll() // 先清空旧的标记
    // 假设你的坐标字典是[String: CLLocationCoordinate2D]类型
    for (identifier, coordinate) in yourCoordinateDictionary {
        let marker = GMSMarker(position: coordinate)
        marker.title = identifier // 可选,给marker加个标题方便识别
        marker.map = mapView // 把marker放到地图上
        mapMarkers.append(marker) // 存到数组里
    }
}

第二步:给地图添加长按手势识别器

长按是地图层面的交互,咱们直接给GMSMapView加一个长按手势监听,这个操作放在viewDidLoad或者地图初始化完成后就行,别放到创建marker的函数里:

override func viewDidLoad() {
    super.viewDidLoad()
    // 初始化地图(你的已有代码)
    mapView.delegate = self // 记得设置代理,可选但有用
    
    // 添加长按手势
    let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleMapLongPress(_:)))
    mapView.addGestureRecognizer(longPressGesture)
    
    // 调用你原来的方法放置marker
    placeMapMarkers()
}

第三步:实现长按处理逻辑,识别并打印坐标

接下来写手势触发后的处理函数,核心是把手势点击的屏幕坐标转成地图经纬度,然后遍历咱们存的marker数组,判断长按的位置是不是在某个marker上,是的话就打印坐标:

@objc func handleMapLongPress(_ gesture: UILongPressGestureRecognizer) {
    // 只在手势刚开始的时候处理一次,避免重复触发
    guard gesture.state == .began else { return }
    
    // 把屏幕触摸点转换成地图上的经纬度
    let touchPoint = gesture.location(in: mapView)
    let tappedCoordinate = mapView.projection.coordinate(for: touchPoint)
    
    // 遍历所有marker,判断长按位置是否对应某个marker
    for marker in mapMarkers {
        // 计算长按点和marker坐标的距离,这里设10米以内就算命中(可以根据需求调整)
        let distance = GMSGeometryDistance(tappedCoordinate, marker.position)
        if distance < 10 {
            print("长按的Marker坐标:纬度\(marker.position.latitude),经度\(marker.position.longitude)")
            return // 找到匹配的就退出循环,不用继续找了
        }
    }
}

额外小提示:另一种给单个marker加长按的方式

如果你只想给特定几个marker加长按,也可以给marker的自定义iconView加手势,但注意默认marker的iconView是nil,得先设置自定义图标才行,代码大概是这样:

// 创建marker的时候
let marker = GMSMarker(position: coordinate)
// 设置自定义图标(必须有这一步,否则iconView是nil)
marker.iconView = UIImageView(image: UIImage(named: "custom-marker"))
marker.iconView?.isUserInteractionEnabled = true // 开启交互
// 添加长按手势
let markerLongPress = UILongPressGestureRecognizer(target: self, action: #selector(handleSingleMarkerLongPress(_:)))
marker.iconView?.addGestureRecognizer(markerLongPress)
marker.map = mapView

然后对应的处理函数:

@objc func handleSingleMarkerLongPress(_ gesture: UILongPressGestureRecognizer) {
    guard gesture.state == .began, let iconView = gesture.view, let marker = mapView.marker(for: iconView) else { return }
    print("长按特定Marker坐标:\(marker.position.latitude), \(marker.position.longitude)")
}

不过这种方式不如给地图加全局手势高效,适合只需要给少数marker加长按的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:56:44