2012-03-27 9 views
107

sonidos simples .. Mantenga el trackpad, mueva el dedo, suelte .. Pero de alguna manera no es provocado golpe (pan se dispara en vez)¿Cuál es la diferencia entre Pan y Deslizar en iOS?

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

Pan es reconocido por la secuencia anterior en su lugar.

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

Si se comenta sartén, golpe es reconocido por el mismo gesto .. Con esto, 2 preguntas:

  • ¿Cuál es la diferencia entonces entre una sartén y un golpe?
  • ¿Cómo se puede simular un deslizamiento en el simulador de iPhone?
+1

@rickster, corrígeme si me equivoco, pero golpe utiliza cuatro direcciones, arriba, abajo, izquierda, derecha y pan puede ser cualquier dirección. Correcto –

Respuesta

195

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

De manera predeterminada, no hay dos reconocedores que reconozcan el mismo gesto, por lo que hay un conflicto entre la panorámica y el deslizamiento. Lo más probable es que su reconocedor panorámico "gane" el conflicto porque su gesto es más simple/más general: un deslizamiento es una panoramización pero una panoramización no puede deslizarse, por lo que la panoramización se reconoce primero y excluye otros reconocedores.

Debería poder resolver este conflicto utilizando el método de delegado gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:, o quizás sin delegación haciendo que el reconocedor de panorámica dependa del reconocedor de barrido con requireGestureRecognizerToFail:.

Una vez resuelto el conflicto, debería poder simular un deslizamiento con un solo dedo arrastrando el mouse rápidamente. (Aunque como el mouse es más preciso que el dedo, es un poco más quisquilloso que hacerlo real en un dispositivo.) Se puede hacer una panorámica/deslizar con dos dedos manteniendo presionadas las teclas de cambio Opción &.

+4

Excelente explicación. ¡Gracias! – JAM

+20

Buena respuesta. Pero no creo que el gesto pan salga 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 una panorámica antes de deslizar. El deslizamiento solo se reconoce en el dedo que se está levantando, la bandeja se reconoce casi inmediatamente después de que el dedo comienza a moverse. Swipe vs. Pan está bien cubierto en Event PG debajo de "Declarar un pedido específico para dos reconocedores de gestos". –

+0

cómo usar estos dos delegados para resolver el conflicto? ¿Puedes explicar más, por favor? – Rawan

23

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

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

+6

Corto y dulce. –

+1

Me gusta esta explicación; aclare el punto en un breve inglés. – Blaszard

2

Según http://hammerjs.github.io/, creo que la diferencia es:

  • pan: las direcciones se mueven en la misma gran vista
  • deslizar: cambiar entre varias vistas

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

0

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

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

Un gesto de panorámica es continuo. Comienza (comenzó) cuando el número mínimo de dedos permitido (minimumNumberOfTouches) se ha movido lo suficiente como para considerarse una panorámica. Cambia (cambia) cuando un dedo se mueve mientras se presiona al menos la cantidad mínima de dedos. Termina (finalizó) 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 se debe usar para los valores de velocidad y de traducción. Los clientes también pueden restablecer la traducción a un valor deseado.

Swift 3 UIPanGestureRecognizer DEMO Ejemplo: -Resource Link

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 manzana. 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 toques son gestos discretos, son discretos para cada estado del reconocedor de gestos; por lo tanto, el mensaje de acción asociado se envía cuando el gesto comienza y se envía para cada estado intermedio hasta (e incluyendo) el estado final del gesto. El código que maneja los gestos de toque debería, por lo tanto, probar el estado del gesto.

Swift 3 UITapGestureRecognizer Demostración EjemploResource Link

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 el reconocedor deenter image description here

+0

La pregunta es sobre la diferencia entre las acciones de barrido y deslizamiento y cómo distinguirlas en un simulador de iPhone. Esta respuesta no aborda ninguno de estos problemas, ya que no menciona gestos de barrido ni simuladores de iPhone. –

+0

@ VinceO'Sullivan Trataré de explicar la definición de Pan y Deslizar. Espero que eso haga entender para diferenciar entre ambos. – Rex

+0

La publicación original tiene cinco años y tiene una respuesta aceptada (que también tiene unos 200 votos al alza). No creo que haya nada útil que agregar (a menos que haya diferencias entre cómo funcionan las cosas ahora y cómo funcionan en la respuesta aceptada). –

Cuestiones relacionadas