有谁知道苹果为什么设计 UIGestureRecognizer默认状态是“可能”的方式(手势识别器尚未识别其手势,但可能正在评估触摸事件。这是默认状态。)而不是“空闲”之类的东西?
在我看来,通过消除“但可能正在评估触摸事件”部分,“空闲”状态会更有意义。 “空闲”——当 UIGestureRecognizer 没有收到任何触摸并且不执行任何分析(触摸、计时器......)。一旦它收到第一次触摸,它就会将它的状态更改为“可能”,表明它执行某种分析(识别逻辑)。
*语境:
我正在为另一个平台编写类似的架构。因此,此状态将有助于将实际执行某些操作的手势识别器与未收到任何触摸或只是忽略它们的手势识别器分开(用于实现 requireGestureRecognizerToFail 方法)。
最佳答案
我们必须从 finite state machines 的角度思考.我的大学自动机文本:Automata and Computability德克斯特·科森。
手势识别器是一组状态,包括 possible
( P
), cancelled
( C
) 和 ended
( E
)。 P
是开始状态,C
和 E
是最终状态。之间P
一端和C
和 E
另一方面,有一系列状态,我们称它们为家庭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/