区分iPhone上的UITouch对象

时间:2009-06-13 01:19:21

标签: iphone objective-c uikit multi-touch

我正试图区分iPhone上的两个(或更多)UITouch对象。 具体来说,我想知道触摸发生的顺序。

例如,在我的-touchesBegan:withEvent:方法中,我得到了一个UITouch对象的NSSet。现在我可以找出有多少触摸,但是,哪个对象代表哪个手指?

我注意到UITouch上的时间戳属性 - 这就是我要找的东西吗?我知道如何获得最后一次或第一次触摸是有用的 - 提供触摸不会改变......

这就是我的问题。我可以使用时间戳来挑出最新的触摸,然后首先发生的触摸移动,IT成为最新的触摸......

在本练习结束时,我希望能够实现“捏”手势来放大或缩小等。

非常感谢任何帮助,谢谢。

6 个答案:

答案 0 :(得分:24)

每个手指都会获得一个UITouch对象,并且会一次又一次地为您提供相同的对象。只需记住指向初始UITouch对象集的指针,并进行指针比较以跟踪手指。

来自Apple的参考文档:

  

触摸对象在序列中对于给定的手指是持久的,并且当UIKit在整个手指中跟踪手指时,UIKit会对其进行变异。更改的触摸属性是触摸的阶段,其在视图中的位置,其先前的位置以及其时间戳。事件处理代码评估这些属性以确定如何响应事件。

答案 1 :(得分:3)

我在这里有一些触摸示例代码:

http://github.com/kailoa/6tringle-touchsamplecode/tree/master http://6tringle.com/blog/2009/TouchSampleCode.html

这对某些人有用,我认为它可能会帮助你。

看看NSMutableArray *ActiveTouches。这是我用来跟踪触摸发生顺序的集合。

在该代码库中有一个pinch和stretch的例子,使用该数组。

答案 2 :(得分:2)

经常讨论的解决方案是观察事件并比较当前的x和y以及之前的x和y值以匹配它们。似乎有一些技巧。事件可能会出现故障,而且我看到过硬件或操作系统看起来像许多(10)移动手指混淆的情况。

有些人指出触摸事件会被重复使用,您可以使用这个事实来跟踪哪个手指是哪个。我相信,StackOverflow至少已经覆盖了一次。

答案 3 :(得分:2)

我看了一下Kailoa Kadano的代码。你基本上保留了当前UITouch对象的NSMutableArray。但是UITouch的文档说明了这一点:

  

UITouch对象是持久的   整个多点触控序列。您   永远不应该保留UITouch对象   处理事件时如果你需要   保持关于触摸的信息   一个阶段到另一个阶段,你应该复制   来自UITouch的信息   对象

如果你在事件结束时再次发布它,我不太明白不保留它的原因,但这就是SDK doc所说的。

答案 4 :(得分:2)

我一直在寻找相同的信息。是的,似乎你不想保留UITouch数据。根据此处的“处理复杂多点触摸序列”部分 Apple Developer Documentation,跟踪多个触摸的“正确”方式是通过UITouch事件的指针值。

答案 5 :(得分:1)

对我给出的这些答案采取高峰可能有所帮助:

getting touches in UIResponder API

iPhone: Tracking/Identifying individual touches