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

