2

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

进一步来说

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

我的理解是,当你在画一个连续的手势时,动作消息会定期发送到目标对象而不一定是每次你改变你的状态时StateChangedStateChanged一次?

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

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

...
if( new_loop_detected )
{
    self.state = UIGestureRecognizerStateChanged;
    [self reset];
}
...

因为这会阻止我提取消息中的循环状态(例如速度和幅度),newLoopRecognized因为它们在发送消息之前被重置。

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

我可以简单地在代码中发送我的通知消息,例如:

...
if( new_loop_detected )
{
    [self performSelector:actionOnNewLoopRecognized onTarget:target];
}
...

但这会触发这些消息事件,即使我设置requireGestureRecognizerToFail了另一个手势识别器以允许这个手势识别器进行检测,而另一个手势识别器还没有时间失败或被识别。

可能的设计

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

StatePossible -> StateRecognizing -> StateRecognized

过渡到 StateRecognizing 将:

  • 发送正确的动作消息(例如,我有一个额外的状态变量,我设置为MessageIsOnNewLoopRecognizedor MessageIsOnAllLoopsRecognized)并在手势识别器上调用 reset
  • 排除需要此手势识别器无法进行检测的手势识别器

问题

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

4

0 回答 0