在同时处理捏合和平移手势识别器时,如何更改触摸位置?

时间:2017-11-26 07:20:58

标签: ios swift uikit uipangesturerecognizer uipinchgesturerecognizer

我正在尝试重新创建类似于照片应用的互动,您可以同时捏合并平移照片。添加或移除触摸中间盘非常有效。

在我的代码中,我使用触摸位置移动视图。当我用两根手指拖动时,平移手势识别器将该点放在两个手指之间(应该如此),但是当我抬起手指时,它将该点改为该手指的点,导致视图猛然移动到新位置

将maximumNumberOfTouches设置为1并不能解决我的问题,因为你可以用finger1触摸,平移,用手指2触摸,平移,抬起手指1,视图将猛然移动到手指2的位置。另外,我想允许2手指平移,因为他们可以捏缩放和旋转图像。

由于其他原因,我也不能使用UIScrollView,但我知道它没有这个问题。

我能想到的唯一解决方案是获取初始触摸位置,然后每次添加或删除手指时,都会根据旧位置偏移新位置。但我不确定如何获取这些信息。

这有API吗?以上方式是唯一的方式,如果是这样,我该怎么做?

1 个答案:

答案 0 :(得分:0)

好的,这就是我解决它的方法。

在手势功能中,我有一个全局变量被赋予触摸位置。

self.touchInView.x = sender.location(in: superview).x - frame.origin.x self.touchInView.y = sender.location(in: superview).y - frame.origin.y self.touchInParent = sender.location(in: superview)

在州== .began我有一个名为OriginalTouch的变量,我设置触摸的位置。

if gesture.state == .began {
originalTouch = self.touchInView
}

然后在state == .changed中我检测触摸次数是否改变并计算偏移量:

//Reset original touch position if number of touch changes so view remains in the same position
if sender.numberOfTouches != lastNumberOfTouches {
   originalTouch.x += (touchInView.x - originalTouch.x)
   originalTouch.y += (touchInView.y - originalTouch.y)
}

lastNumberOfTouches = sender.numberOfTouches

现在我可以根据originalTouch

设置视图的位置
self.frame.origin = touchInParent - originalTouch