Яка різниця між Pan і Swipe в iOS?


129

Звучить просто .. Утримуйте трекпад, рухайте пальцем, відпустіть .. Але якось проведіть пальцем не запускається (замість цього спрацьовує панорама)

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
@rickster, виправте мене, якщо я помиляюся, але проведіть пальцем чотири напрямки: вгору, вниз, вліво, вправо, і панорама може бути в будь-якому напрямку. Правильно
Віктор Енгель

Відповіді:


231

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

За замовчуванням жоден два впізнавачі не розпізнають один і той же жест, тому між панорами та пальцем протікає конфлікт. Швидше за все, ваш розпізнавальник каструлі "виграє" конфлікт, оскільки його жест простіший / загальніший: проведіть пальцем, але панорама може бути не пальцем, тому пан розпізнає перший і виключає інших розпізнавачів.

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

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


24
Гарна відповідь. Але я не думаю, що жест панорамування перемагає тому, що він більш загальний, а скоріше тому, що це безперервний жест (де проведіть пальцем дискретний жест), тому панорамування розпізнається перед проведенням пальця. Проведення пальця розпізнається лише на піднятому пальці, сковороду розпізнають майже відразу після того, як палець починає рухатися. Проведення Swipe vs. Pan добре висвітлено в PG події у розділі "Оголошення певного порядку для двох розпізнавачів жестів".
король Неван

27

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

Панель жесту працюватиме, коли ви перетягнете палець у будь-якому напрямку. Ви можете дати йому прискорення або уповільнення. Наприклад, переміщення об'єкта з одного місця в інше або спінінг.


3

Згідно з яблучним документом. Apple UIPanGestureRecognizer Різниця між панеллю та пальцем, як показано нижче: -

UIPanGestureRecognizer - це конкретний підклас UIGestureRecognizer який шукає переміщення (перетягування) жестів. Користувач повинен натискати одним або декількома пальцями на погляді під час панорамування. Клієнти, що реалізують метод дії для цього розпізнавача жестів, можуть запитати його про поточний переклад і швидкість жесту.

Жест панорамування безперервний. Він починається ( починається ), коли мінімальна кількість дозволених пальців (мінімальна кількість NFOTOFTouches ) перемістилася достатньо, щоб вважатись сковородою. Він змінюється (змінюється), коли палець рухається, хоча принаймні мінімальна кількість пальців натиснута вниз. Він закінчується ( закінчується ), коли всі пальці підняті.

Клієнти цього класу можуть у своїх методах дії запитувати об’єкт 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")
}

Приклад зображення для розпізнавачавведіть тут опис зображення


Питання полягає в тому, чим різняться дії переміщення панораму та пальця, і як їх розрізнити на тренажері iPhone. Ця відповідь не стосується жодного з цих питань, оскільки вона не згадує ні пальцями, ні симуляторами iPhone.
Вінс О'Салліван

@ VinceO'Sullivan, я спробую пояснити визначення Пана і Суіп. Я сподіваюся, що це зрозуміє, щоб розрізняти їх обох.
Рекс

Оригінальному посту п’ять років, і він прийняв відповідь (що також має близько 200 голосів). Я не думаю, що ви можете додати щось корисне (якщо тільки немає відмінностей між тим, як зараз працюють справи, і тим, як вони працювали у прийнятій відповіді).
Вінс О'Салліван

@ VinceO'Sullivan Я пояснюю це простим способом простим прикладом та визначенням яблучного документа. Я думаю, що це зосереджується більше на темі та малюнку, показує сенсорний малюнок в iOS.
Рекс

0

За даними http://hammerjs.github.io/ , я думаю, що різниця полягає в наступному:

  • панорама: переміщуйте напрямки в тому самому великому вікні
  • проведіть пальцем: перемикайтеся між кількома видами перегляду

Жест однаковий, обидва користуються одним пальцем і рухаються.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.