【问题标题】:UIGestureRecognizerDelegate to manage gestures -- can I dealloc touch?UIGestureRecognizerDelegate 来管理手势——我可以解除触摸吗?
【发布时间】:2012-12-18 16:44:42
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 您可以禁止进一步的操作。请看问题:stackoverflow.com/questions/11667329/…
  • @Fawaz 我认为这不适用于我的情况。我有一个主视图,其中包含未知数量的子视图,这些子视图本质上是四处移动的精灵。我正在使用的手势识别器附加到主视图,而不是子视图。识别器永远不需要被移除,除非我遗漏了什么。

标签: ios uigesturerecognizer gesture pan


【解决方案1】:

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

【讨论】:

  • 我刚刚对触摸位置和触摸实例进行了跟踪,结果让我感到惊讶。基本上,我所做的是添加一个打印出触摸实例编号的 NSLog,当它通过触摸循环时我会增加它,并打印出触摸位置。只有一个实例。当我在前一个平移过程中添加新平移时,位置只会更新每个平移,就好像运动从一个移动到另一个一样。我认为每次触摸都会有单独的触摸实例。
  • 忘记之前的评论。有单独的对象。我一定有一个错误阻止第二个被识别。在回到这个问题之前,我会解决这个错误。
  • 这似乎正在发生:UI 流程:1) 用户启动 touch1,2) 用户移动 touch1,3) 用户启动 touch2,4) 用户移动 touch2,5) 用户结束 touch2, 6)用户端touch1(可能一直在移动)。结果是为 touch1 而不是为 touch2 调用了 touchesEnded。这是一个意想不到的结果,我不知道如何处理。有一个带有开始、移动但没有结束或取消的触摸对象。所以我处理触摸的逻辑永远不会被调用。
  • 您是否尝试将识别器 maximimumNumberOfTouches 设置为 1?这可能会消除您的第二次泛手势问题。
  • 如果我想要不止一次触摸怎么办?如果这是问题所在,我希望单个对象的触摸次数不是一个。事实并非如此。
【解决方案2】:

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

首先:使用 ARC,您不应尝试解除分配任何内容,但您可以禁用手势。例如,如果您已将手势命名为 panGesture,您可以这样做:

panGesture.enabled = NO;

不要尝试分配和释放,只需启用和禁用。

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

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

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

当然还有这里:

Event Handling Guide for iOS: Gesture Recognizers

【讨论】:

  • 我不记得为什么我没有使用平移手势识别器,但它的限制太严格了。我想我没有指出我正在使用 UIGestureRecognizerDelegate 并捕获开始、移动、结束和取消事件。
【解决方案3】:

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


因为您使用了 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 中并忽略这些触摸

【讨论】:

  • 您是否建议存在我应该使用的取消方法(我在文档中没有看到)或者我在我的子类中创建自己的方法?
【解决方案4】:

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

要识别点击,我只需将touchesBegantouchesEnded 处的触摸对象的坐标进行比较,如果坐标相同或移动不明显,则将其视为点击。我忽略了touchesMoved,因为在我的应用程序中几乎不可能发生在大致相同的位置开始和结束但在两者之间移动的触摸。

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

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多