什么时候将“手指”事件作为手势发送到UIGestureRecognizer与touchesBegan / touchesMoved / touchesEnded到UIView

时间:2019-04-27 19:39:44

标签: ios swift uiview uigesturerecognizer uievent

我来自macOS / Cocoa和Mouse Events,我想了解一下这些“ Finger”事件(我自己的名字)


我的问题是:

UIView上发生“手指”事件(我们叫MyView)时,何时将其作为Gesture发送到{{ 1}},何时将其作为UIGestureRecognizer发送到MyView


我已经搜索了所有可能想到的查询,实际上只找到了一些不错的信息来源,但没有任何内容可以准确地回答我的需求

touchesBegan, touchesEnded, touchesMoved for moving UIView

UIGestureRecognizers vs touchesBegan/touchesMoved/touchesEnded (accuracy)

我现在最好的猜测是 touchBegan / touchMoved / touchEnded 与手势识别器之间的差异取决于手指的速度吗?

因此,如果您点击并缓慢移动,则底层touchesBegan/touchesMoved/touchesEnded会收到MyView事件。如果您快速点击并拖动,将创建一个手势并将其传递到基础UIView

的GestureRecognizer

我目前的猜测是,当手指着地时,事件运行循环会检测到该手指,并触发touchMoved。当您移动手指时,会触发UIView
但是,如果您移动得足够快,或者以运行时认为您正在做出手势的方式,它会创建一个手势并将消息发送到touchesBegan,而不是发送touchesMoved

我目前正在尝试验证这个假设,但是这很繁琐,并且我没有一个非常好的示例项目可以进行测试,因此我认为如果可能的话,我会众包一些见识。如果我自己也解决的话,我会报告。

1 个答案:

答案 0 :(得分:1)

这很复杂(或者可以是),但是基本规则很简单。 [有关更多详细信息,请参见my book。]

手指是包裹在UIEvent中以便传递的UITouch。交付过程开始触摸,触摸移动,触摸移动...触摸结束/取消,此时手指不再在那里。

当出现触摸(手指)时,会将初始UITouch / UIEvent(开始触摸)发送到视图 以及其手势识别器和所有手势识别器。这样,触摸就可以正常传递到视图,并且手势识别器可以同时考虑手势。

这种情况不断重复发生(触摸已移动),直到触摸被解除(触摸结束)或手势识别器之一可以识别为止。在后一种情况下,所有其他g.r.s被迫失败,触摸被取消,只有识别的g.r.被清除。在进行过程中得到其余的触摸。