В чем разница между Pan и Swipe в iOS? - PullRequest
121 голосов
/ 28 марта 2012

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

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?

Ответы [ 4 ]

223 голосов
/ 28 марта 2012

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

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

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

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

27 голосов
/ 13 января 2015

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

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

0 голосов
/ 27 мая 2017

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

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

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

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

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 UITapGestureRecognizer

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

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

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

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")
}

Пример изображения для распознавателя enter image description here

0 голосов
/ 23 июня 2016

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

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

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

...