有没有人知道为什么Apple设计UIGestureRecognizer默认状态为“可能”的方式(手势识别器尚未识别其手势,但可能正在评估触摸事件。这是默认设置状态。)而不是像“闲置”这样的东西?
通过消除“但可能正在评估触摸事件”部分,我认为“空闲”状态会更有意义和意义。 “闲置” - 当UIGestureRecognizer没有收到任何触摸并且不执行任何分析(触摸,计时器......)时。一旦收到第一次触摸,它就会将其状态更改为“可能”,表示它执行某种分析(识别逻辑)。
*上下文: 我正在为另一个平台编写类似的架构。因此,这种状态有助于将实际做某事的手势识别器与未接受任何触摸的手势识别器分开,或者只是忽略它们(用于实现requireGestureRecognizerToFail方法)。
答案 0 :(得分:3)
我们必须考虑finite state machines。我的大学自动化文本:Dexter Kozen的Automata and Computability。
手势识别器是一组状态,包括possible
(P
),cancelled
(C
)和ended
(E
)。 P
是开始状态,C
和E
是最终状态。在一端的P
和另一端的C
和E
之间,有一系列状态,我们称之为家庭S*
。并且在所有各种状态之间存在由触摸事件和定时器事件触发的转换。 P
,S*
,C
,E
的特定排列以及它们之间的过渡都是特定手势识别器的功能。
例如,假设我们想要一个单点触摸识别器来调用方法,如果用户执行单点触摸(1td
),然后单击(1tu
)。 5秒。否则我们希望它取消。所以我们得到以下机器:
(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
,需要输入事件。突然,作为被识别的手势的字符串变得长一个字母 - 因此识别的手势不是我们所追求的手势,而是例如点击然后手势,或者触摸然后手势
这会改变被识别的手势,从而违背我们的目的。