В чем разница между Pan и Swipe в iOS?

Звучит просто ... Удерживайте трекпад, переместите палец, отпустите .. Но почему-то не запускается свайп (вместо этого запускается панорамирование)

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] 
      initWithTarget:v action:@selector(handleSwipe:)];
swipeGesture.direction= UISwipeGestureRecognizerDirectionUp;
[v addGestureRecognizer:swipeGesture];

Вместо этого панорама распознается по приведенной выше последовательности.

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] 
      initWithTarget:v action:@selector(handlePan:)];
[v addGestureRecognizer: panGesture];

Если панорамирование прокомментировано, смахивание распознается тем же жестом .. При этом 2 вопроса:

  • В чем же тогда разница между панорамированием и проведением пальцем?
  • Как можно смоделировать салфетки на симуляторе iPhone?

person James Raitsev    schedule 27.03.2012    source источник
comment
@rickster, поправьте меня, если я ошибаюсь, но свайп использует четыре направления: вверх, вниз, влево, вправо, а панорамирование может быть любым. Правильный   -  person Victor Engel    schedule 10.12.2012


Ответы (3)


По определению, жест смахивания обязательно также является жестом панорамирования - оба включают поступательное движение точек касания. Разница заключается в семантике распознавателя: распознаватель панорамирования ищет начало поступательного движения и продолжает сообщать о движении в любом направлении с течением времени, в то время как распознаватель движения принимает мгновенное решение относительно того, перемещаются ли прикосновения пользователя линейно в требуемом направлении.

По умолчанию никакие два распознавателя не распознают один и тот же жест, поэтому между панорамированием и смахиванием возникает конфликт. Скорее всего, ваш распознаватель панорамирования «побеждает» в конфликте, потому что его жест более простой / общий: сдвиг - это сдвиг, но лоток может не быть сдвигом, поэтому лоток распознает первым и исключает другие распознаватели.

Вы должны иметь возможность разрешить этот конфликт с помощью метода делегата gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: или, возможно, без делегирования, сделав распознаватель панорамирования зависимым от распознавателя смахивания с помощью requireGestureRecognizerToFail:.

Когда конфликт разрешен, вы сможете имитировать смахивание одним пальцем, быстро перетащив мышь. (Хотя мышь точнее, чем ваш палец, это немного сложнее, чем делать настоящие вещи на устройстве.) Панорамирование / пролистывание двумя пальцами можно выполнять, удерживая клавиши Option и Shift.

person rickster    schedule 27.03.2012
comment
Хороший ответ. Но я думаю, что жест панорамирования выигрывает не потому, что он более общий, а потому, что это непрерывный жест (где пролистывание - это дискретный жест), поэтому панорамирование распознается перед проведением. Смахивание распознается только по поднятому пальцу, сковорода распознается почти сразу после того, как палец начинает двигаться. Смахивание по сравнению с панорамированием подробно описано в событии PG в разделе «Объявление определенного порядка для двух распознавателей жестов». - person nevan king; 08.10.2013

Жест смахивания будет работать, когда вы перетаскиваете палец только в определенных направлениях (смахивание вверх, смахивание вниз, смахивание влево, смахивание вправо). Например, прокручиваемые ячейки в контроллере табличного представления.

Pan Gesture будет работать, если вы проведете пальцем в любом направлении. Вы можете придать ему ускорение или замедление. Например, перемещение объекта из одного места в другое или вращение спиннера.

person Daya Kevin    schedule 13.01.2015

Согласно http://hammerjs.github.io/, я думаю, что разница в следующем:

  • панорамирование: перемещать направления в одном большом окне
  • свайп: переключение между несколькими представлениями

Жест одинаковый, оба используют один палец и двигаются.

person JasmineOT    schedule 22.06.2016