UIPanGestureRecognizer 的准确起始位置?

Posted

技术标签:

【中文标题】UIPanGestureRecognizer 的准确起始位置?【英文标题】:Accurate start position for UIPanGestureRecognizer? 【发布时间】:2014-07-05 16:02:28 【问题描述】:

我正在使用UIPanGestureRecogniser 来实现拖放。当拖动开始时,我需要识别被拖动的对象。但是对象相对较小。如果用户没有在对象的中心点击对象,它就不会被拖动。

问题在于,当手势处理程序第一次以状态UIGestureRecognizerStateBegan 调用时,手指已经移动了几个像素,所以[UIPanGestureRecognizer locationInView:] 返回那个点,这不是手势真正开始的地方。这是有道理的,因为它只能在移动几个像素后才能识别平移。但是,我需要手势的绝对开始,而不是手势首次被识别后的位置。

我在想也许我还需要实现一个轻击手势识别器,纯粹是为了捕捉第一次触摸。但这似乎是一个不寻常的要求。没有其他方法可以从平移手势识别器中获得第一次触摸吗?

【问题讨论】:

您是否想过通过继承UIView 来使用事件处理方法touchesBegan:touchesMoved: 被拖动的视图有多大?理想情况下,它们应该至少 44x44 点。如果他们满足这个要求,那么也许我们可以解决您的问题。 目前最小的对象是 44x46 点。这是一个通用问题,会影响任何大小的任何拖动对象。较小的对象更明显,因为始终可拖动的对象中间的区域相对较小。 这能回答你的问题吗? UIPanGestureRecognizer starting point is off 【参考方案1】:

UIGestureRecognizerDelegate 协议提供了方法gestureRecognizerShouldBegin:gestureRecognizer:shouldReceiveTouch: 可以帮助您在平移转换到状态UIPanGestureRecognizerStateBegan 之前评估触摸

【讨论】:

不幸的是,gestureRecognizer:shouldReceiveTouch: locationInView: 仍然有上一个 pan 的位置。在gestureRecognizerShouldBegin: 的位置与我已经在普通处理程序中获得的位置相同。 locationOfTouch:inView: 在使用这两种方法时同样无济于事。 如果你打电话给gesture.locationInView,那么是的,你会得到一个错误的值。但是,如果您致电touch.locationInView,您将获得准确的值。请注意,回调方法为您提供了两个对象(手势和触摸)。有关详细信息,请参阅this answer。

以上是关于UIPanGestureRecognizer 的准确起始位置?的主要内容,如果未能解决你的问题,请参考以下文章

在 UIButtons 上禁用 UIPanGestureRecognizer

UIPanGestureRecognizer 碰撞

如何在父视图中限制 UIPanGestureRecognizer

linux-安装后的准本工作

UIPanGestureRecognizer 干扰滚动

未调用 iOS 13 UIPanGestureRecognizer 选择器