В чем разница между панорамированием и прокруткой в ​​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?

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Жест один и тот же, оба используют один палец и перемещаются.

Ответ 4

В соответствии с документом Apple. Apple UIPanGestureRecognizerразница между панорамированием и салфеткой, как показано ниже: -

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

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

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

Swift 3 UIPanGestureRecognizer Демо-пример: - Ссылка ресурса

import UIKit

class ViewController: UIViewController {
// this records our circle 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 Ссылка ресурса

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

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