Как различать объекты UITouch На iPhone
-
13-09-2019 - |
Вопрос
Я пытаюсь провести различие между двумя (или более) Объекты UITouch на iPhone.В частности, я хотел бы знать, в каком порядке происходили касания.
Например, в my -touchesBegan:с событием:метод, которым я получаю NSSet объектов UITouch.Теперь я могу узнать, сколько всего касаний, но какой объект представляет какой палец?
Я заметил свойство timestamp в UITouch - это то, что я ищу?Я вижу, как это было бы полезно для получения последнего или первого касания - при условии, что касания не изменяются...
В этом и заключается моя проблема.Я могу использовать временную метку, чтобы выделить последнее касание, но тогда касание, которое произошло первым, перемещается, и ОНО становится последним касанием...
В конце этого упражнения я хотел бы иметь возможность реализовать жест "ущипнуть" для увеличения или уменьшения масштаба и т.д.
Любая помощь была бы высоко оценена, спасибо.
Решение
У меня есть пример сенсорного кода:
http://github.com/kailoa/6tringle-touchsamplecode/tree/master http://6tringle.com/blog/2009/TouchSampleCode.html
Некоторым людям это было полезно, и я думаю, что это может помочь вам.
Взгляните на NSMutableArray *ActiveTouches
.Эту коллекцию я использую для отслеживания порядка, в котором происходят касания.
В базе кода есть пример сжатия и растяжения, в котором используется этот массив.
Другие советы
Каждый палец получает один объект UITouch, а такой же объект дается вам снова и снова.Просто запомните указатели на набор исходных объектов UITouch и выполните сравнение указателей, чтобы отслеживать пальцы.
Из справочной документации Apple:
Объект касания является постоянным для данного пальца во время последовательности, и UIKit изменяет его, отслеживая палец на протяжении всей последовательности.Атрибутами касания, которые изменяются, являются фаза касания, его местоположение на представлении, его предыдущее местоположение и его временная метка.Код обработки событий оценивает эти атрибуты, чтобы определить, как реагировать на событие.
Часто обсуждаемое решение — наблюдать за событиями и сравнивать текущие значения x и y и предыдущие значения x и y, чтобы сопоставить их.Хотя, похоже, есть некоторые хитрости.События могут происходить не по порядку, и я видел случаи, когда казалось, что оборудование или операционная система путаются из-за множества (10) движущихся пальцев.
Несколько человек отметили, что события касания используются повторно, и вы можете использовать этот факт, чтобы отслеживать, какой палец какой.Я полагаю, что это было рассмотрено хотя бы один раз на StackOverflow.
Я взглянул на код Кайлоа Кадано.По сути, вы сохраняете NSMutableArray текущих объектов UITouch.Однако в документации UITouch указано следующее:
Объект UITouch является постоянным на протяжении всей последовательности мультитач.Вам никогда не следует сохранять объект UITouch при обработке события.Если вам нужно сохранить информацию о касании от одной фазы к другой, вам следует скопировать эту информацию из объекта UITouch .
Я не совсем понимаю причину не сохранять его, если вы отпустите его снова после завершения события, но это то, что сказано в документе SDK.
Я искал ту же информацию.И да, похоже, вы не должны сохранять данные UITouch.В соответствии с разделом «Обработка сложной последовательности мультитач» данного руководстваДокументация для разработчиков Apple, «правильный» способ отслеживания нескольких касаний — это значение указателя события UITouch.
Взгляните на эти ответы, которые я дал, которые могут помочь: