Qual è la differenza tra Pan e Swipe in iOS?


129

Sembra semplice .. Tenere premuto il trackpad, spostare il dito, rilasciare .. Ma in qualche modo il colpo non viene attivato (invece viene attivato il pan)

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

La panoramica è invece riconosciuta dalla sequenza precedente.

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

Se la panoramica viene commentata, lo scorrimento viene riconosciuto dallo stesso gesto. Con questo, 2 domande:

  • Qual è la differenza tra una padella e un colpo?
  • Come si può simulare un colpo sul simulatore di iPhone?

1
@Rickster, correggimi se sbaglio, ma scorri utilizza quattro direzioni: su, giù, sinistra, destra e pan può essere qualsiasi direzione. Corretto
Victor Engel il

Risposte:


231

Per definizione, un gesto di scorrimento è necessariamente anche un gesto di panoramica, entrambi implicano il movimento traslazionale dei punti di contatto. La differenza sta nella semantica del riconoscitore: un riconoscitore di panoramica cerca l'inizio del movimento traslazionale e continua a riferire il movimento in qualsiasi direzione nel tempo, mentre un riconoscitore a scorrimento prende una decisione istantanea sul fatto che i tocchi dell'utente si spostino linearmente nella direzione richiesta.

Per impostazione predefinita, non ci sono due riconoscitori che riconoscono lo stesso gesto, quindi c'è un conflitto tra pan e swipe. Molto probabilmente, il tuo riconoscitore di pan "vince" il conflitto perché il suo gesto è più semplice / più generale: un colpo è un pan ma un pan potrebbe non essere un colpo, quindi il pan riconosce per primo ed esclude altri riconoscitori.

Dovresti essere in grado di risolvere questo conflitto usando il metodo delegate gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:, o forse senza delega, facendo in modo che il riconoscimento pan dipenda dal riconoscimento dello scorrimento con requireGestureRecognizerToFail:.

Con il conflitto risolto, dovresti essere in grado di simulare un colpo di un dito trascinando rapidamente il mouse. (Sebbene il mouse sia più preciso del dito, è un po 'più schizzinoso che fare la cosa reale su un dispositivo.) È possibile eseguire la panoramica / scorrimento con due dita tenendo premuti i tasti Opzione e Maiusc.


24
Bella risposta. Ma non penso che il gesto di pan vince perché è più generale, ma piuttosto perché è un gesto continuo (in cui uno scorrimento è un gesto discreto), quindi un pan viene riconosciuto prima di uno scorrimento. Il colpo viene riconosciuto solo sul dito sollevato, la padella viene riconosciuta quasi immediatamente dopo che il dito inizia a muoversi. Swipe vs. Pan è trattato bene nel PG eventi sotto "Dichiarazione di un ordine specifico per due riconoscitori di gesti".
re nevan,

27

Il gesto di scorrimento funziona quando trascini il dito solo in determinate direzioni (scorri verso l'alto, scorri verso il basso, scorri verso sinistra, scorri verso destra). Ad esempio celle scorrevoli nel controller della vista tabella.

Il gesto Pan funzionerà quando trascini il dito in qualsiasi direzione. Puoi dare accelerazione o decelerazione ad esso. Ad esempio, spostare un oggetto da un posto a un altro o far girare un filatore.


3

Come da documento Apple. Apple UIPanGestureRecognizer La differenza tra una panoramica e uno scorrimento come di seguito: -

UIPanGestureRecognizer è una sottoclasse concreta di UIGestureRecognizer che cerca gesti di panning (trascinamento). L'utente deve premere una o più dita su una vista mentre la sposta. I clienti che implementano il metodo di azione per questo riconoscitore di gesti possono chiedere la traduzione e la velocità correnti del gesto.

Un gesto di panning è continuo. Inizia ( iniziata ) quando il numero minimo di dita consentito ( minimumNumberOfTouches ) si è spostato abbastanza da essere considerato una panoramica. Cambia (cambia) quando un dito si muove mentre almeno il numero minimo di dita viene premuto. Termina ( terminato ) quando tutte le dita vengono sollevate.

I clienti di questa classe possono, nei loro metodi di azione, interrogare l'oggetto UIPanGestureRecognizer per la traduzione corrente del gesto ( traduzione (in :) ) e la velocità della traduzione ( velocità (in :) ). Possono specificare la vista il cui sistema di coordinate dovrebbe essere usato per i valori di traslazione e velocità. I clienti possono anche ripristinare la traduzione sul valore desiderato.

Swift 3 UIPanGestureRecognizer Demo Esempio: - Collegamento risorse

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

Come da documento Apple. Apple UITapGestureRecognizer

UITapGestureRecognizer è una sottoclasse concreta di UIGestureRecognizer che cerca rubinetti singoli o multipli. Affinché il gesto venga riconosciuto, il numero specificato di dita deve toccare la vista un numero specificato di volte.

Sebbene i tocchi siano gesti discreti, sono discreti per ogni stato del riconoscimento dei gesti; pertanto il messaggio di azione associato viene inviato quando inizia il gesto e viene inviato per ogni stato intermedio fino allo stato finale del gesto (e incluso). Il codice che gestisce i gesti dei tocchi dovrebbe quindi verificare lo stato del gesto.

Swift 3 UITapGestureRecognizer Demo Esempio Link alle risorse

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

Immagine di esempio per il riconoscimentoinserisci qui la descrizione dell'immagine


La domanda riguarda la differenza tra le azioni di pan e swipe e come distinguerle su un simulatore di iPhone. Questa risposta non affronta nessuno di questi problemi, dal momento che non menziona né gesti di scorrimento né simulatori di iPhone.
Vince O'Sullivan,

@ VinceO'Sullivan Proverò a spiegare la definizione di Pan e Swipe. Spero che possa far capire la differenza tra entrambi.
Rex,

Il post originale ha cinque anni e ha una risposta accettata (che ha anche circa 200 voti in più). Non credo ci sia qualcosa di utile da aggiungere (a meno che non ci siano differenze tra il modo in cui le cose funzionano ora e il modo in cui hanno funzionato nella risposta accettata).
Vince O'Sullivan,

@ VinceO'Sullivan Lo spiego in modo semplice con un semplice esempio e la definizione di un documento Apple. Penso che si concentri maggiormente su entrambi l'argomento e l'immagine mostra il modello di tocco in iOS.
Rex,

0

Secondo http://hammerjs.github.io/ , penso che la differenza sia:

  • pan: sposta le direzioni nella stessa vista grande
  • scorri: passa da una vista all'altra

Il gesto è lo stesso, entrambi usano un dito e si muovono.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.