自定义离散手势识别器能够发送多个离散动作并响应requireGestureRecognizerToFail要求

时间:2012-10-23 15:45:27

标签: objective-c ios cocoa uigesturerecognizer gesture

我遇到了自定义手势识别的一些问题。我正在尝试做一些与UIGestureRecognizer实现的一般用例略有不同的事情。

更具体地说

  • 我有离散手势,但我希望他们在手势期间在特定点发送几条消息(例如,我有一个“循环”手势,我希望每次有一个newLoopRecognized消息新的循环,以及手势结束时的allLoopsRecognized消息)
  • 我希望能够在某些消息之后“重置”手势状态,但是允许手势识别器仍然接收事件(并且不必移除所有触摸,并且全部开始手势:每次我发送newLoopRecognized消息,我希望能够在不抬起手指并重新开始的情况下绘制新循环,如果切换到GestureRecognized状态则无法进行此操作
  • 我想要几个可能需要其他手势识别器失败的手势

我的理解是,当您绘制连续手势时,操作消息将定期发送到目标对象 ,而不一定每次从{{更改状态时1}}再次StateChanged

因此,这在我的情况下不起作用,因为我只想在某个特定事件(新循环的开始)发送事件。

另外,如果我使用连续手势方法,我将无法通过以下方式在每个连续循环之间重置我的状态:

StateChanged

因为这会阻止我在... if( new_loop_detected ) { self.state = UIGestureRecognizerStateChanged; [self reset]; } ... 消息中提取循环的状态(例如速度和幅度),因为它们在消息发送之前被重置。

我可以使用一种复杂的方法,例如将我所有的状态变量复制到我将在newLoopRecognized消息中使用的另一个变量中,但这会很混乱。

我只需在代码中发送通知消息,例如:

newLoopRecognized

但是,即使我在另一个手势识别器上设置... if( new_loop_detected ) { [self performSelector:actionOnNewLoopRecognized onTarget:target]; } ... 以允许此检测器进行检测,而另一个尚未有时间失败或被识别,这会触发这些消息事件。

可能的设计

如果使用常规的UIGestureRecognizer实现没有简单的方法来实现我的设计,我可能不得不扩展离散手势状态

requireGestureRecognizerToFail

转换到StateRecognizing的地方:

  • 发送正确的操作消息(例如我有一个我设置为StatePossible -> StateRecognizing -> StateRecognized MessageIsOnNewLoopRecognized的附加状态变量)并在手势识别器上调用重置
  • 排除需要此手势识别器无法进行检测的手势识别器

问题

有没有办法使用常规的UIGestureRecognizer子类来做我想要的,或者我应该重新实现整个手势识别框架?是否有适当的此类实现示例,或者您是否知道什么是正确的设计?如果我要重新实现完整的手势框架,我希望它与常规手势向后兼容,以允许我使用iOS手势而无需重新实现它们。

0 个答案:

没有答案