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