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

129

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

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

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

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

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

  • В чем же тогда разница между панорамированием и смахиванием?
  • Как можно смоделировать салфетки на симуляторе iPhone?
Джеймс Райцев
источник
1
@rickster, поправьте меня, если я ошибаюсь, но свайп использует четыре направления: вверх, вниз, влево, вправо, а панорамирование может быть любым. Правильно
Виктор Энгель

Ответы:

231

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

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

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

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

rickster
источник
24
Хороший ответ. Но я думаю, что жест панорамирования выигрывает не потому, что он более общий, а потому, что это непрерывный жест (где пролистывание - это дискретный жест), поэтому панорамирование распознается перед проведением. Смахивание распознается только по поднятому пальцу, сковорода распознается почти сразу после того, как палец начинает двигаться. Свайп против панорамирования хорошо освещен в событии PG в разделе «Объявление определенного порядка для двух распознавателей жестов».
Nevan King 08
27

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

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

Дайя Кевин
источник
3

Согласно документу Apple. Apple UIPanGestureRecognizer Разница между панорамированием и смахиванием, как показано ниже: -

UIPanGestureRecognizer - это конкретный подкласс UIGestureRecognizer, который ищет жесты панорамирования (перетаскивания). Пользователь должен нажимать одним или несколькими пальцами на вид во время его панорамирования. Клиенты, реализующие метод действия для этого распознавателя жестов, могут запросить у него текущий перевод и скорость жеста.

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

Клиенты этого класса могут в своих методах действий запрашивать у объекта UIPanGestureRecognizer текущий перевод жеста ( перевод (in :) ) и скорость перемещения ( скорость (in :) ). Они могут указать вид, система координат которого должна использоваться для значений перемещения и скорости. Клиенты также могут сбросить перевод до желаемого значения.

Пример демонстрации Swift 3 UIPanGestureRecognizer: - Ссылка на ресурс

import UIKit

class ViewController: UIViewController {
// this records our circle's center for use as an offset while dragging
var circleCenter: CGPoint!

override func viewDidLoad() {
    super.viewDidLoad()

    // Add a draggable view
    let circle = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))
    circle.center = self.view.center
    circle.layer.cornerRadius = 50.0
    circle.backgroundColor = UIColor.green()

    // add pan gesture recognizer to
    circle.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.dragCircle)))

    self.view.addSubview(circle)
}

func dragCircle(gesture: UIPanGestureRecognizer) {
    let target = gesture.view!

    switch gesture.state {
    case .began, .ended:
        circleCenter = target.center
    case .changed:
        let translation = gesture.translation(in: self.view)
        target.center = CGPoint(x: circleCenter!.x + translation.x, y: circleCenter!.y + translation.y)
    default: break
    }
  }
}

Согласно документу Apple. Apple UITapGestureRecognizer

UITapGestureRecognizer - это конкретный подкласс UIGestureRecognizer, который ищет одно или несколько нажатий. Для распознавания жеста указанное количество пальцев должно коснуться представления указанное количество раз.

Хотя касания являются дискретными жестами, они дискретны для каждого состояния распознавателя жестов; таким образом, связанное сообщение действия отправляется, когда жест начинается, и отправляется для каждого промежуточного состояния до (и включая) конечного состояния жеста. Поэтому код, обрабатывающий жесты касания, должен проверять состояние жеста.

Swift 3 UITapGestureRecognizer Demo Пример Ссылка на ресурс

override func viewDidLoad() {
   super.viewDidLoad()

   let tap = UITapGestureRecognizer(target: self, action: #selector(doubleTapped))
   tap.numberOfTapsRequired = 2
   view.addGestureRecognizer(tap)
}
func doubleTapped() {
     // do something cool here
     print("Test TapGesture")
}

Пример изображения для распознавателявведите описание изображения здесь

Rex
источник
Вопрос в том, в чем разница между действиями панорамирования и смахивания и как их различить на симуляторе iPhone. Этот ответ не касается ни одной из этих проблем, поскольку в нем не упоминаются ни жесты смахивания, ни симуляторы iPhone.
Винс О'Салливан
@ VinceO'Sullivan Я попытаюсь объяснить определение Pan и Swipe. Я надеюсь, что это поможет понять различие между ними обоими.
Rex
Исходному сообщению пять лет, и на него есть принятый ответ (который также набрал около 200 голосов). Я не думаю, что вам есть что добавить (если нет различий между тем, как все работает сейчас, и тем, как они работали в принятом ответе).
Винс О'Салливан,
@ VinceO'Sullivan Я легко объясняю это с помощью простого примера и определения документа Apple. Я думаю, что больше внимания уделяется как теме, так и картинке, показывающей шаблон касания в iOS.
Rex
0

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

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

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

JasmineOT
источник