Различение объектов UITouch на iPhone - PullRequest
8 голосов
/ 13 июня 2009

Я пытаюсь различить два (или более) объектов UITouch на iPhone. В частности, я хотел бы знать порядок, в котором происходили прикосновения.

Например, в моем -touchesBegan: withEvent: метод я получаю NSSet объектов UITouch. Теперь я могу узнать, сколько касаний существует, но какой объект представляет какой палец?

Я заметил свойство метки времени в UITouch - это то, что я ищу? Я вижу, как это было бы полезно для получения последнего или первого прикосновения - при условии, что прикосновения не видоизменяются ...

В этом и заключается моя проблема. Я могу использовать отметку времени, чтобы выделить последнее касание, но затем первое касание, которое произошло, перемещается, и ИТ становится последним касанием ...

В конце этого упражнения я бы хотел реализовать жест «щепотка» для увеличения или уменьшения масштаба и т. Д.

Любая помощь будет принята с благодарностью, спасибо.

Ответы [ 6 ]

24 голосов
/ 13 июня 2009

Каждый палец получает один объект UITouch, и один и тот же объект выдается вам снова и снова. Просто запомните указатели на набор исходных объектов UITouch и проведите сравнение указателей, чтобы отслеживать пальцы.

Из справочных документов Apple:

Сенсорный объект является постоянным для данного пальца во время последовательности, и UIKit мутирует его, поскольку он отслеживает палец по нему. Изменяемые атрибуты касания - это фаза касания, его местоположение в представлении, его предыдущее местоположение и его временная метка. Код обработки событий оценивает эти атрибуты, чтобы определить, как реагировать на событие.

3 голосов
/ 13 июня 2009

У меня есть здесь пример кода касания:

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

Это было полезно для некоторых людей, и я думаю, что это может помочь вам.

Взгляните на NSMutableArray *ActiveTouches. Это коллекция, которую я использую для отслеживания порядка, в котором происходят прикосновения.

В базе кода есть пример сжатия и растяжения, использующий этот массив.

2 голосов
/ 28 марта 2010

Я искал ту же информацию. И да, похоже, вы не предполагаете сохранять данные UITouch. В соответствии с разделом «Обработка сложной последовательности Multi-Touch» Документация для разработчиков Apple , «правильный» способ отслеживания нескольких касаний заключается в значении указателя события UITouch.

2 голосов
/ 22 октября 2009

Я посмотрел код Кайлоа Кадано. Вы в основном сохраняете NSMutableArray текущих объектов UITouch. Однако документация UITouch гласит:

Объект UITouch является постоянным на протяжении всей последовательности мультитач. Вы никогда не должен сохранять объект UITouch при обработке события. Если вам нужно держать информацию о прикосновении от одну фазу в другую, вы должны скопировать эта информация из UITouch объект.

Я не совсем вижу причину не сохранять его, если вы отпустите его снова, когда событие закончится, но именно об этом говорит док SDK.

2 голосов
/ 13 июня 2009

Часто обсуждаемое решение - наблюдать за событиями и сравнивать текущие значения x и y и предыдущие значения x и y, чтобы сопоставить их. Там, кажется, есть некоторые хитрости, хотя. События могут происходить не по порядку, и я видел случаи, когда аппаратное обеспечение или операционная система путались с большим количеством (10) движущихся пальцев.

Несколько человек указали, что сенсорные события используются повторно, и вы можете использовать этот факт, чтобы отслеживать, какой палец какой. Я думаю, что это было хотя бы раз рассмотрено в StackOverflow.

1 голос
/ 13 июня 2009
...