0

我正在开发一个应用程序,其中大多数触摸手势都是平移手势(但我没有使用平移手势识别器)。我正在使用UIGestureRecognizerDelegate和使用touchesBegan, touchesMoved,touchesEndedtouchesCancelled. 但是,屏幕上有几个位置,如果平移从那里开始,我想将其识别为点击事件。我可以通过简单地识别 touchesBegan 中的位置来做到这一点。我的问题是,我可以在那时解除触摸以防止锅的继续吗?如果平底锅从屏幕中的这个位置开始,则可以保证它不是用户真正想要的平底锅。我希望这是有道理的。

编辑:我已经意识到,即使对于一个应该被忽略的点,管理水龙头的额外开销也是微不足道的,所以我想我会这样做。不过,我会在这里保留这个问题,以防有办法阻止手势继续被跟踪。

我还需要关于如何处理以下情况的建议。

假设用户启动了一个平底锅(不是在刚刚描述的区域,而是在它真正打算成为平底锅的地方),并且当平底锅进行时,另一个平底锅在屏幕上的其他地方启动。我如何识别这种情况?

编辑:我现在正在测试这段代码是否能解决这个问题:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
   return YES;
}

编辑:ARC 禁止显式释放,所以现在我将我的问题修改为更一般的问题,如果有的话,我可以做些什么来抑制进一步的行动。还是我只需要处理它?

4

4 回答 4

1

你想要 UIGestureRecognizerDelegate 方法gestureRecognizer:shouldReceiveTouch:。至于识别第二个平移何时开始而一个已经在进行中,您可以尝试在手势识别器开始识别触摸时设置的状态变量。

于 2012-12-18T17:55:58.617 回答
0

我不确定我是否完全理解您的问题,但也许这会有所帮助:

第一:使用 ARC,你不应该尝试释放任何东西,但你可以禁用手势。例如,如果您已将手势命名为 panGesture,您可以这样做:

panGesture.enabled = NO;

与其尝试分配和解除分配,不如启用和禁用。

第二:您可以跟踪平移手势的动作。在您的 IBAction 方法中,您可以捕获第一次触摸的坐标,然后根据手势开始的位置决定是否要将其运动计为平移或触摸。

有关 Pan Gestures 的更多信息,我建议你看这里:

iOS 5 中的 UIGestureRecognizer 教程:捏、平底锅等!

当然,在这里:

iOS 事件处理指南:手势识别器

于 2012-12-18T17:25:09.900 回答
0

不,你不能解除分配它,无论如何这都行不通


因为你使用 GestureRecognizer 你可以取消它

@interface UIGestureRecognizer (Cancel)
- (void)cancel;
@end

@implementation UIGestureRecognizer (Cancel)
- (void)cancel
{
    self.enabled = NO;
    self.enabled = YES;
}
@end

或者

你必须取消触摸......但到目前为止,只有私人 api 可以做到这一点。你最好的选择是为你的班级设置一个布尔值,比如 _isCanceled

在 touchesBegan 中将其重置为 NO 并在您想要结束触摸处理时将其设置为 YES

或者

您可以将要取消的触摸保存在您存储在课堂上的 NSSET 中并忽略这些触摸

于 2012-12-18T17:31:05.970 回答
0

这是我最终使用的解决方案。

为了识别点击,我只需比较触摸对象的坐标,如果坐标相同或移动不明显,则将touchesBegantouchesEnded视为点击。我忽略touchesMoved了,因为触摸开始和结束大约在同一个地方,但在我的应用程序中不太可能发生在两者之间移动的情况。

为了在第一个平移开始后识别第二个平移,我跟踪触摸对象。在这种情况下,第一个和第二个平移获得两个不同的触摸对象。我最初是在跟踪坐标并遵循将 currentLocation 与 previousLocation 匹配的菊花链,但这不起作用,因为由于某种原因,第二次触摸的行为与第一次不同。无论如何,跟踪触摸对象很简单。就代码而言,它不“知道”第二个触摸对象是否与第一个触摸对象同时发生。

于 2012-12-22T03:55:16.047 回答