我在自定义手势识别方面遇到了一些问题。我正在尝试做一些与 UIGestureRecognizer 实现的一般用例略有不同的事情。
进一步来说
- 我有离散的手势,但我希望他们在手势期间的特定点发送几条消息(例如,我有一个“循环”手势,我想在
newLoopRecognized
每次有新循环时发送一条消息,并allLoopsRecognized
在手势结束) - 我希望能够在一些消息后“重置”手势状态,但允许手势识别器仍然接收事件(并且不必删除所有触摸,并重新开始手势:每次发送
newLoopRecognized
消息时,我希望能够在不抬起手指并重新开始的情况下绘制新的循环,如果我切换到GestureRecognized
状态,这是不可能的) - 我想要几个手势可能需要其他手势识别器失败
我的理解是,当你在画一个连续的手势时,动作消息会定期发送到目标对象,而不一定是每次你改变你的状态时StateChanged
再StateChanged
一次?
因此这在我的情况下不起作用,因为我只想在某个特定事件(新循环的开始)发送事件。
此外,如果我使用连续手势方法,我将无法通过以下方式在每个连续循环之间重置我的状态:
...
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 将:
- 发送正确的动作消息(例如,我有一个额外的状态变量,我设置为
MessageIsOnNewLoopRecognized
orMessageIsOnAllLoopsRecognized
)并在手势识别器上调用 reset - 排除需要此手势识别器无法进行检测的手势识别器
问题
有没有办法使用常规的 UIGestureRecognizer 子类来做我想做的事情,或者我应该重新实现整个手势识别框架?是否有此类实现的合适示例,或者您知道正确的设计是什么?如果我要重新实现完整的手势框架,我希望它能够向后兼容常规手势,以便我无需重新实现即可使用 iOS 手势。