¿Cuál es la diferencia entre Pan y Swipe en iOS?

129

Suena simple ... Sostenga el Trackpad, mueva el dedo, suéltelo ... Pero de alguna manera no se activa el deslizamiento (en cambio, se activa la panorámica)

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

Pan se reconoce por la secuencia anterior en su lugar.

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

Si se comenta la panorámica, el deslizamiento se reconoce por el mismo gesto. Con esto, 2 preguntas:

  • ¿Cuál es la diferencia entonces entre una sartén y un deslizamiento?
  • ¿Cómo se puede simular un deslizamiento en el simulador de iPhone?
James Raitsev
fuente
1
@rickster, corrígeme si me equivoco, pero deslizar usa cuatro direcciones, arriba, abajo, izquierda, derecha y la panorámica puede ser cualquier dirección. Correcto
Victor Engel

Respuestas:

231

Por definición, un gesto de deslizamiento es necesariamente también un gesto de desplazamiento, ambos implican un movimiento de traslación de puntos de contacto. La diferencia está en la semántica del reconocedor: un reconocedor panorámico busca el comienzo del movimiento traslacional y continúa informando movimiento en cualquier dirección a lo largo del tiempo, mientras que un reconocedor deslizante toma una decisión instantánea sobre si los toques del usuario se movieron linealmente en la dirección requerida.

De forma predeterminada, no hay dos reconocedores que reconozcan el mismo gesto, por lo que existe un conflicto entre la panorámica y el deslizamiento. Lo más probable es que su reconocedor de pan "gane" el conflicto porque su gesto es más simple / más general: un deslizamiento es un pan, pero un pan puede no ser un deslizamiento, por lo que el pan reconoce primero y excluye a otros reconocedores.

Debería poder resolver este conflicto utilizando el método de delegado gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:, o tal vez sin delegación haciendo que el reconocimiento de desplazamiento dependa del reconocimiento de deslizamiento requireGestureRecognizerToFail:.

Con el conflicto resuelto, debería poder simular un deslizamiento con un solo dedo arrastrando rápidamente el mouse. (Aunque como el mouse es más preciso que su dedo, es un poco más complicado que hacer lo real en un dispositivo). Se puede hacer un barrido / deslizamiento con dos dedos presionando las teclas Opción y Mayús.

rickster
fuente
24
Buena respuesta. Pero no creo que el gesto panorámico gane porque es más general, sino más bien porque es un gesto continuo (donde un deslizamiento es un gesto discreto), por lo que se reconoce un panorámico antes de un deslizamiento. El deslizamiento solo se reconoce en el dedo que se levanta, la bandeja se reconoce casi inmediatamente después de que el dedo comienza a moverse. Swipe vs. Pan está bien cubierto en el Evento PG bajo "Declarar un orden específico para dos reconocedores de gestos".
nevan king
27

El gesto de deslizamiento funcionará cuando arrastre el dedo solo en ciertas direcciones (deslizar hacia arriba, deslizar hacia abajo, deslizar hacia la izquierda, deslizar hacia la derecha). Por ejemplo, celdas deslizables en el controlador de vista de tabla.

Pan Gesture funcionará cuando arrastre el dedo en cualquier dirección. Puedes darle aceleración o desaceleración. Por ejemplo, mover un objeto de un lugar a otro o girar una ruleta.

Daya Kevin
fuente
3

Según el documento de Apple. Apple UIPanGestureRecognizer La diferencia entre una sartén y un deslizamiento de la siguiente manera: -

UIPanGestureRecognizer es una subclase concreta de UIGestureRecognizer que busca gestos de desplazamiento (arrastre). El usuario debe presionar uno o más dedos en una vista mientras la desplaza. Los clientes que implementan el método de acción para este reconocedor de gestos pueden solicitarle la traducción actual y la velocidad del gesto.

Un gesto panorámico es continuo. Comienza ( comenzó ) cuando el número mínimo de dedos permitidos ( mínimoNúmero de Toques ) se ha movido lo suficiente como para ser considerado una panorámica. Cambia (cambia) cuando un dedo se mueve mientras al menos se presiona el número mínimo de dedos. Termina ( finaliza ) cuando se levantan todos los dedos.

Los clientes de esta clase pueden, en sus métodos de acción, consultar el objeto UIPanGestureRecognizer para la traducción actual del gesto ( traducción (en :) ) y la velocidad de la traducción ( velocidad (en :) ). Pueden especificar la vista cuyo sistema de coordenadas debe usarse para los valores de traducción y velocidad. Los clientes también pueden restablecer la traducción al valor deseado.

Ejemplo de demostración de Swift 3 UIPanGestureRecognizer: - Enlace de recursos

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

Según el documento de Apple. Apple UITapGestureRecognizer

UITapGestureRecognizer es una subclase concreta de UIGestureRecognizer que busca grifos simples o múltiples. Para que se reconozca el gesto, el número especificado de dedos debe tocar la vista un número específico de veces.

Aunque los grifos son gestos discretos, son discretos para cada estado del reconocedor de gestos; así, el mensaje de acción asociado se envía cuando comienza el gesto y se envía para cada estado intermedio hasta (e incluyendo) el estado final del gesto. Por lo tanto, el código que maneja los gestos táctiles debe probar el estado del gesto.

Enlace de recursos de ejemplo de demostración Swap 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")
}

Imagen de ejemplo para Recognizeringrese la descripción de la imagen aquí

Rex
fuente
La pregunta es sobre la diferencia entre las acciones de desplazamiento y deslizamiento y cómo distinguirlas en un simulador de iPhone. Esta respuesta no aborda ninguno de esos problemas, ya que no menciona ni gestos de deslizamiento ni simuladores de iPhone.
Vince O'Sullivan
@ VinceO'Sullivan Trataré de explicar la definición de Pan y Swipe. Espero que eso haga entender para diferenciar entre los dos.
Rex
La publicación original tiene cinco años y tiene una respuesta aceptada (que también tiene alrededor de 200 votos). No creo que haya nada útil para agregar (a menos que haya diferencias entre cómo funcionan las cosas ahora y cómo funcionaron en la respuesta aceptada).
Vince O'Sullivan
@ VinceO'Sullivan Lo explico de manera fácil con ejemplos simples y la definición de documentos de Apple. Creo que se centra más en el tema y la imagen que muestra el patrón táctil en iOS.
Rex
0

De acuerdo con http://hammerjs.github.io/ , creo que la diferencia es:

  • pan: mover direcciones en la misma vista grande
  • deslizar: cambiar entre varias vistas

El gesto es el mismo, ambos usan un dedo y se mueven.

JasmineOT
fuente