我正在开发一款应用程序,其中大多数触摸手势都是平移手势(但我没有使用平移手势识别器)。我正在使用UIGestureRecognizerDelegate
并使用touchesBegan
,touchesMoved
,touchesEnded
和touchesCancelled
。但是,屏幕上有几个点,如果平移开始,我想将其识别为点击事件。我可以通过简单地识别touchesBegan中的位置来做到这一点。我的问题是,我可以在那时取消触摸以防止平底锅的延续吗?如果平移从屏幕中的此位置开始,则保证不会被用户真正用作平移。我希望这是有道理的。
我还需要一个如何处理以下情况的建议。
假设用户启动了一个平底锅(不是在刚刚描述的区域,而是在其他地方,它确实是一个平底锅),并且当平移正在进行时,另一个平移启动在屏幕的其他地方。我如何识别这种情况?
编辑:我现在正在测试此代码是否会解决此问题:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
编辑:ARC禁止显式dealloc,所以现在我将我的问题修改为一个更普遍的问题,如果有的话,我可以做些什么来抑制进一步的行动。或者我只需要处理它?</ p>
答案 0 :(得分:1)
您需要UIGestureRecognizerDelegate方法gestureRecognizer:shouldReceiveTouch:。至于识别何时第二个平移启动而其中一个正在进行中时,您可以尝试在手势识别器开始识别触摸时设置的状态变量。
答案 1 :(得分:0)
我不确定我是否完全理解你的问题,但也许这会有所帮助:
首先:使用ARC,你不应该尝试释放任何东西,但你可以禁用手势。例如,如果您已将手势命名为panGesture,则可以执行以下操作:
panGesture.enabled = NO;
而不是尝试分配和解除分配,只需启用和禁用。
第二:您可以跟踪平移手势的移动。在您的IBAction方法中,您可以捕获第一次触摸的坐标,然后根据手势的开始位置决定是否要将此动作计为平移或触摸。
有关Pan Gestures的更多信息,我建议你看看:
UIGestureRecognizer Tutorial in iOS 5: Pinches, Pans, and More!
当然,在这里:
答案 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)
以下是我最终使用的解决方案。
要识别点按,我只需比较touchesBegan
到touchesEnded
的触摸对象的坐标,如果坐标相同或移动不明显,则将其视为点按。我忽略touchesMoved
因为触摸开始和结束在大约相同的位置,但在我的应用中不太可能发生。
要在第一个平移开始后识别第二个平移,我会跟踪触摸对象。在这种情况下,第一个和第二个平移获得两个不同的触摸对象。我最初跟踪坐标并跟随菊花链匹配currentLocation与previousLocation,但这不起作用,因为第二次触摸由于某种原因与第一次触摸的行为不同。无论如何,跟踪触摸对象很简单。就代码而言,它并不“知道”第二个触摸对象是否与第一个触摸对象同时发生。