iPhone: Как совместить жест длинного нажатия и операцию перетаскивания вместе на карте? - PullRequest
5 голосов
/ 22 сентября 2011

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

Мне нужно как-то объединить операции длительного нажатия и перетаскивания в одну операцию, что-то вроде LongPressThenDragGestureRecognizer. Я пытаюсь сделать это в MKMapView, поэтому я не могу просто отключить взаимодействие с пользователем все время, потому что мне нужны функции панорамирования и масштабирования карты.

Чтобы немного усложнить ситуацию, необходимо удалить начальный элемент (объект MKOverlay), на который пользователь долго нажимает, чтобы распознать взаимодействие, и заменить его новым нарисованным объектом. В этот момент код больше не заботится об объекте, только там, где палец находится в любой заданной точке (я буду перерисовывать перетаскиваемый объект по мере его движения).

Это рабочий процесс:

  1. Пользователь получает оверлей на карте
  2. Пользователь касается и удерживает элемент, чтобы приложение знало, что оно хочет перетащить его
  3. Приложение заменяет наложение нарисованным объектом и отключает карту, чтобы оно не начинало панорамирование (а не перетаскивание).
  4. Пользователь перетаскивает палец, и объект перерисовывается при движении.
  5. Пользователь поднимает палец, чтобы завершить перетаскивание
  6. Приложение заменяет нарисованный объект новым наложением карты
  7. Приложение позволяет взаимодействовать с пользователем на карте, позволяя выбирать панорамирование / масштабирование / аннотации и т. Д.

Я пробовал несколько вещей, но без особого успеха. Лучшие результаты, которые у меня есть, перечислены ниже. Это было сделано с помощью UILongPressGestureRecognizer на объектах MKMapView (проверка пересечения с наложением), а затем переопределив touchesBegan для перетаскивания карты.

  • Отображается оверлей, и пользователь успешно выполняет жест длинного нажатия, который распознается соответствующим образом
  • Взаимодействие пользователя с картой отключено, а наложение заменено нарисованным объектом
  • Пользователь должен поднять палец и снова коснуться, чтобы начать операцию перетаскивания
  • Когда пользователь поднимает палец, рисуется новое наложение и снова включается взаимодействие с картой

Я так близко, я просто не знаю, как объединить жесты, чтобы пользователю не нужно было поднимать палец и снова касаться, чтобы начать перетаскивание.

Любые идеи приветствуются.

1 Ответ

0 голосов
/ 01 августа 2012

Если это такой сложный жест, как у меня, у меня возникнет соблазн полностью отказаться от распознавателя жестов и перейти к касаниям Beg, touchesMoved, touchedEnded, touchesCancelled с некоторым состоянием, которое вы перемещаете, хотя этот жест знает, где находится.*

MKMapView имеет базовый класс UIResponder, поэтому должно быть легко создать собственную производную версию MKMapView, которая реагирует на сенсорные события (не забывая передавать их в супер карту для поддержания ее нормальной функциональности).

...