如何在iPhone上进行捏合手势?

11

如何在iPhone上实现捏合手势?我熟悉在iPhone上使用触摸事件,但是我非常懒惰,不想在如此普遍的捏合手势中重新发明轮子...提供源代码或相关链接将会很有帮助。


1
请查看此示例以了解有关捏合缩放的信息:http://cocoabugs.blogspot.com/2011/03/pinch-zoom-using-uipinchgesturerecogniz.html - jeeva
4个回答

8

您需要使用一些基本的数学知识自行实现。

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

以下是您需要在应用程序中实现的委托方法。

您需要获取两个触摸点之间的距离,然后在自己的代码中计算距离的变化。

用于获取距离的数学方程式称为点积

我只想指出,在引用的教程中使用的方程式是不正确的。我已经更新了它,包括在教程中遗漏的绝对值。

这是点积:

- (CGFloat)distanceBetweenTwoPoints:(CGPoint)fromPoint toPoint:(CGPoint)toPoint
{
    float xDist = fromPoint.x - toPoint.x;
    float yDist = fromPoint.y - toPoint.y;

    float result = sqrt( pow(xDist,2) + pow(yDist,2) );
    return result;
}

编辑: 我在之前的回答中犯了一个错误...已经有一段时间没有做过这种数学计算了。

如果你不对结果进行平方根运算,就无法得到两点之间的真实距离。这被称为计算两个向量之间的大小。

这是正确的方法。如果你想省略平方根运算,你将不能得到两点之间的确切距离。

如果你不对答案进行平方运算,你的代码会工作,但使用的测量值比实际值要大得多。因此,如果你将来需要获取两点之间的距离,它将返回类似于90000而不是实际像素距离300px的东西。


嗯...我不确定你引用的“点积”链接会有多大帮助,但至少谢谢你的回复... - RexOnRoids
再说,为什么我需要在你提供的方法中摆弄平方根来获取两点之间的距离呢?我通常只是做这样的事情: differenceX = pointA.x - pointB.x; differenceY = pointA.y - pointB.y;...那么,我错过了什么吗? - RexOnRoids
谢谢澄清。顺便问一下,作为游戏程序员,您是否曾经实现过捏合手势功能?如果是的话,能否提供一些源代码帮助我们呢?我相信很多人会受益。谢谢。 - RexOnRoids
如果你能提供一些关于捏合手势实现的相关资源,我会给你打勾。否则,这个检查标记将给提供了一个更相关教程链接的marcc。 - RexOnRoids
sqrt函数不是总是返回正数吗?为什么要取绝对值? - Sophie Alpert
显示剩余2条评论

8

可以肯定的是,这里提出的解决方案已经过时了,现在iOS 3.2及以上版本推荐使用新的UIPinchGestureRecognizer类来实现。


2
只要市面上有大量的3.2设备,这就不那么重要了。 - Jonny

6

嗯……似乎有些人在如何使用基本数学方面非常困惑。点积完全无关紧要,只会让问题更加混乱。两个向量之间的点积用于计算它们之间的角度。

实际上,您需要使用勾股定理。点积与寻找点之间距离没有任何关系——只与勾股定理有关!


可以使用点运算符来计算两个点之间的距离,方法如下:sqrt(dot(p2-p1,p2-p1)) - twerdster

1

如果你正在寻找一个简单的捏合手势代码示例,我使用了Brock在这个我在这里描述的示例应用程序中描述的方法(在该页面上倒数第二和最后版本的应用程序中使用了捏合手势来缩放几个核心动画层)。

就距离计算而言,他所描述的只是在两点之间应用勾股定理(以X和Y距离作为直角三角形的两个面)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接