iPhone:如何在地图上结合长按手势和拖动操作?

时间:2011-09-22 17:58:54

标签: iphone sdk drag-and-drop mkmapview uigesturerecognizer

我尝试了很多东西,在这一点上发布代码可能会令人困惑,所以让我先从概念开始。

我需要以某种方式将长按和触摸拖动的操作组合到一个操作中,例如LongPressThenDragGestureRecognizer。我试图在MKMapView上完成这个,所以我不能一直禁用用户交互,因为我想要地图的平移和缩放功能。

为了使事情复杂化,需要删除用户长按以识别交互的初始项(MKOverlay对象)并替换为新绘制的对象。此时,代码不再关心对象,只有手指处于任何给定点的位置(我将在移动时重绘拖动的对象)。

这是工作流程:

  1. 用户在地图上显示重叠
  2. 用户触摸并按住该项目以让应用知道他们想要拖动它
  3. 应用程序用绘制的对象替换叠加层并禁用地图,以便它不会开始平移(而不是拖动)。
  4. 用户拖动手指,对象在移动时重绘。
  5. 用户抬起手指完成拖动
  6. App用新的地图叠加替换绘制的对象
  7. App可在地图上启用用户交互,以允许平移/缩放/注释选择等。
  8. 到目前为止,我已经尝试过很多东西,收效甚微。我到目前为止的最佳结果如下所示。这是使用MKMapView对象上的UILongPressGestureRecognizer(检查与叠加的交集)完成的,然后覆盖touchesBegan以进行地图触摸拖动。

    • 显示叠加,用户成功执行可以正确识别的长按手势
    • 禁用地图用户互动,并使用绘制对象替换叠加层
    • 用户必须抬起手指并再次触摸以启动拖动操作
    • 当用户抬起手指时,会绘制新的叠加层并再次启用地图交互

    我非常接近,我只是不知道如何将手势合二为一,这样用户就不必抬起手指再次触摸以开始拖动。

    非常感谢任何想法。

1 个答案:

答案 0 :(得分:0)

如果这是一个像这样的复杂手势,我会试图完全避开手势识别器并移动到touchesBegan,touchesMoved,touchEnded,touchesCancelled,你移动的状态,因为手势恰好知道你在哪里。

MKMapView有一个UIResponder基类,所以应该很容易制作你自己的MKMapView派生版本,它响应触摸事件(记住将它们传递到超级地图以维持它的正常功能)。