iPhone:如何在地图上同时使用长按手势和拖动操作?

5
我尝试了多种方法,如果现在发布代码可能会让人困惑,因此让我先解释一下这个概念。
我需要将长按和触摸拖动的操作合并为单个操作,类似于LongPressThenDragGestureRecognizer。我正在尝试在MKMapView上完成此操作,因此不能在整个过程中禁用用户交互,因为我需要地图的平移和缩放功能。
稍微复杂一些的是,用户长按的初始项(一个MKOverlay对象)将需要被移除并替换为新的绘制对象。此时,代码只关心手指在任何给定点的位置(当他们移动时,我将重新绘制拖动的对象)。
这是工作流程:
1. 用户在地图上呈现叠加层 2. 用户触摸并长按某个项目以让应用程序知道他们想要拖动它 3. 应用程序使用绘制对象替换叠加层,并禁用地图,以防止开始平移(而不是拖动) 4. 用户拖动手指,对象会随着他们的移动重新绘制 5. 用户抬起手指以完成拖动 6. 应用程序使用新的地图叠加层替换绘制的对象 7. 应用程序启用地图上的用户交互,以允许平移/缩放/注释选择等操作。
迄今为止,我已经尝试了很多方法,但几乎没有什么成功的。目前为止最好的结果是使用UILongPressGestureRecognizer在MKMapView对象上(检查与覆盖层的交叉)进行操作,并替换map touch drag的touchesBegan。
以下是最佳效果:
1. 显示覆盖层,并成功执行长按手势 2. 禁用地图用户交互,并用绘制对象替换覆盖层 3. 用户必须抬起手指并再次触摸才能启动拖动操作 4. 当用户抬起手指时,会绘制新的覆盖层,并再次启用地图交互
我很接近成功了,只是不知道如何将手势合并为一个,以便用户不必抬起手指并再次触摸即可开始拖动。非常感谢任何想法。

我以前用过一种更简单的方法实现了这个功能,但仍然使用了长按来启动拖动。我使用了一个简单的布尔值。长按0.25秒后,将布尔值设置为是,只有在布尔值为是时才允许进行拖动手势。 - Ryan Poolos
1个回答

0
如果是这样的复杂手势,我会倾向于避免使用手势识别器,而是使用touchesBegan、touchesMoved、touchedEnded和touchesCancelled等方法,并通过一些状态来跟踪手势的位置。
MKMapView具有UIResponder基类,因此很容易创建自己派生版本的MKMapView,以响应触摸事件(记得将它们传递给超级地图以维护其正常功能)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接