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

