UIGestureRecognizerDelegate管理手势 - 我可以dealloc touch吗?

时间:2012-12-18 16:44:42

标签: ios uigesturerecognizer gesture pan

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

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

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

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

编辑:我现在正在测试此代码是否会解决此问题:

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

编辑:ARC禁止显式dealloc,所以现在我将我的问题修改为一个更普遍的问题,如果有的话,我可以做些什么来抑制进一步的行动。或者我只需要处理它?<​​/ p>

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

首先:使用ARC,你不应该尝试释放任何东西,但你可以禁用手势。例如,如果您已将手势命名为panGesture,则可以执行以下操作:

panGesture.enabled = NO;

而不是尝试分配和解除分配,只需启用和禁用。

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

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

UIGestureRecognizer Tutorial in iOS 5: Pinches, Pans, and More!

当然,在这里:

Event Handling Guide for iOS: Gesture Recognizers

答案 2 :(得分:0)

不,你不能解除分配,而且无论如何都无法运作


因为你使用了GestureRecognizer,你可以取消

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

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

OR

你必须取消接触......但到目前为止只有私人api才能做到这一点。 你最好的选择是为你的班级设置一个bool,如_isCanceled

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

OR

你可以在你班级存储的NSSET中保存想要取消的动画并忽略这些动作

答案 3 :(得分:0)

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

要识别点按,我只需比较touchesBegantouchesEnded的触摸对象的坐标,如果坐标相同或移动不明显,则将其视为点按。我忽略touchesMoved因为触摸开始和结束在大约相同的位置,但在我的应用中不太可能发生。

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