cocoa-touch - UIGestureRecognizer 状态。为什么没有像 "idle"这样的状态?

标签 cocoa-touch uikit uigesturerecognizer gesture gesture-recognition

有谁知道苹果为什么设计 UIGestureRecognizer默认状态是“可能”的方式(手势识别器尚未识别其手势,但可能正在评估触摸事件。这是默认状态。)而不是“空闲”之类的东西?

在我看来,通过消除“但可能正在评估触摸事件”部分,“空闲”状态会更有意义。 “空闲”——当 UIGestureRecognizer 没有收到任何触摸并且不执行任何分析(触摸、计时器......)。一旦它收到第一次触摸,它就会将它的状态更改为“可能”,表明它执行某种分析(识别逻辑)。

*语境:
我正在为另一个平台编写类似的架构。因此,此状态将有助于将实际执行某些操作的手势识别器与未收到任何触摸或只是忽略它们的手势识别器分开(用于实现 requireGestureRecognizerToFail 方法)。

最佳答案

我们必须从 finite state machines 的角度思考.我的大学自动机文本:Automata and Computability德克斯特·科森。

手势识别器是一组状态,包括 possible ( P ), cancelled ( C ) 和 ended ( E )。 P是开始状态,CE是最终状态。之间P一端和CE另一方面,有一系列状态,我们称它们为家庭S* .并且在所有不同状态之间存在由触摸事件和定时器事件触发的转换。 P的具体安排, S* , C , E ,以及它们之间的转换,赋予特定手势识别器其功能。

例如,假设我们希望单点触控识别器在用户执行单点触控 ( 1td ) 时调用一个方法,然后在 0.5 秒内执行单点触控 ( 1tu )。否则我们希望它取消。所以我们得到以下机器:

(P,1td) -> S
(S,1tu) -> E
(S,.5s) -> C

拼写:
When in state `possible`, upon receipt of a single touch-down event, transition to state `S`.
When in state `S`, upon receipt of a single touch-up event, transition to state `ended`.

当我们到达状态时 ended手势识别器执行我们的回调。所以单独使用这两个就可以了,除了有时间要求 - 用户必须在触地后 0.5 秒内释放他的触摸,否则手势不是真正的单次触摸。所以我们有第三个生产:
When in state `S`, if a .5 second timer triggers (`.5s`), then enter state `cancelled`.

此外,我们可能还有一大堆其他可能发生的事情,例如“三个触地得分”(3td)事件。所有这些其他事情都会立即将机器移入 cancelled状态。所以我们可能有(除其他外)这个产品:
(P,3td) -> C

等等。

因此,我们可以将手势识别器想象成一台大型机器,它将输入事件字母表中的“字母”作为输入,接受(结束)该字母表中的某些字符串集,并拒绝(取消)其他字符串。对于那些还不知道的人 - 这是正则表达式的理论基础。没错 - 手势识别器只是在触摸和计时事件字母表上的正则表达式解析器。他们识别的手势只是用那个字母表写的字符串。

所以我们得到了问题的关键——为什么没有空闲状态 I一开始,一个“启动”手势识别器的工具是 possible状态?原因是从I过渡至 P需要一个输入事件。突然,作为被识别手势的字符串变长了一个字母——因此识别的手势不是我们想要的手势,而是,例如,轻敲然后手势,或者触摸然后手势.

这改变了被识别的姿态,从而违背了我们的目的。

关于cocoa-touch - UIGestureRecognizer 状态。为什么没有像 "idle"这样的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9547610/

相关文章:

objective-c - UISwipeGestureRecognizer 调用了两次

iphone - 自动释放与释放

iphone - 使用默认选项卡 Controller 创建的项目...第一个 View Controller 不响应 addsubview

swift - 在 Swift 中访问 superview 的更简洁的方法?

ios - Swift - 向 UITextfield 添加带有间距的底线

iphone - 双击 UIScrollView 内部到另一个 View

ios - 在自定义 UIGestureRecognizer 中维护触摸之间的状态

ios - UITableViewCell 内的 UIView 上的 UIGestureRecognizer

iphone - 如何重新创建 UITabBarItem 图像过滤器?

ios - NSURLCache 真的如本文所述需要初始化吗?