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

iOS Swift中如何禁用Google Maps拖动标记的抬起动画及地图上移效果

Google Maps iOS:实现标记滑动拖动+关闭抬起时地图上移效果

刚好之前做项目时遇到过一模一样的需求,给你分享两个可行的方案,既能实现标记拖动时的平滑滑动效果,又能关掉那个默认的地图上移提示:

方案一:完全自定义拖动手势(推荐,控制度最高)

默认的标记拖动逻辑是SDK内置的,没法直接关闭地图上移,但我们可以完全接管拖动行为,自己实现滑动效果,同时彻底避免地图乱动。

步骤1:禁用默认拖动,添加自定义手势

先把标记的默认拖动关掉,然后给地图加一个拖动手势来处理标记移动:

// 初始化你的标记(替换成你自己的marker实例)
let marker = GMSMarker(position: holeLocation)
marker.draggable = false // 禁用SDK默认的拖动逻辑
marker.map = self.gMapView

// 添加自定义拖动手势
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handleMarkerPan(_:)))
self.gMapView.addGestureRecognizer(panGesture)

步骤2:处理手势,实现平滑滑动

在手势处理方法里,我们可以实时更新标记位置,还能在拖动结束时加个减速动画,让滑动效果更自然:

@objc private func handleMarkerPan(_ gesture: UIPanGestureRecognizer) {
    let touchPoint = gesture.location(in: self.gMapView)
    let targetCoordinate = self.gMapView.projection.coordinate(for: touchPoint)
    
    switch gesture.state {
    case .began:
        // 拖动开始时临时禁用地图交互,防止误触移动地图
        self.gMapView.isUserInteractionEnabled = false
    case .changed:
        // 实时更新标记位置,实现跟随手指滑动的效果
        marker.position = targetCoordinate
    case .ended, .cancelled:
        // 拖动结束时添加减速动画,模拟自然滑动的收尾
        let velocity = gesture.velocity(in: self.gMapView)
        let finalTouchPoint = CGPoint(
            x: touchPoint.x + velocity.x * 0.1,
            y: touchPoint.y + velocity.y * 0.1
        )
        let finalCoordinate = self.gMapView.projection.coordinate(for: finalTouchPoint)
        
        UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 0.7) {
            self.marker.position = finalCoordinate
        } completion: { _ in
            // 恢复地图交互
            self.gMapView.isUserInteractionEnabled = true
        }
    default:
        break
    }
}

方案二:抵消默认的地图上移(快速 hack 方式)

如果你不想完全重写拖动逻辑,也可以用个小技巧抵消SDK默认的地图上移效果:

// 实现GMSMapViewDelegate的方法
func mapView(_ mapView: GMSMapView, didBeginDragging marker: GMSMarker) {
    // 记录拖动前的相机位置
    let originalCamera = mapView.camera
    // 延迟极短时间重置相机,抵消SDK的上移操作
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
        mapView.camera = originalCamera
    }
}

不过这种方法可能会有轻微的视觉抖动,适合快速验证需求,长期用还是推荐方案一。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:53:17