Quelle est la différence entre Pan et Swipe dans iOS?

129

Cela semble simple .. Maintenez le Trackpad, déplacez le doigt, relâchez .. Mais d'une manière ou d'une autre, le balayage n'est pas déclenché (le panoramique est déclenché à la place)

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

Pan est reconnu par la séquence ci-dessus à la place.

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

Si le panoramique est commenté, le balayage est reconnu par le même geste. Avec ceci, 2 questions:

  • Quelle est alors la différence entre un panoramique et un balayage?
  • Comment simuler un balayage sur un simulateur iPhone?
James Raitsev
la source
1
@rickster, corrigez-moi si je me trompe, mais le balayage utilise quatre directions, haut, bas, gauche, droite et panoramique peut être n'importe quelle direction. Correct
Victor Engel

Réponses:

231

Par définition, un geste de balayage est nécessairement aussi un geste de panoramique - les deux impliquent un mouvement de translation des points de contact. La différence réside dans la sémantique du module de reconnaissance: un module de reconnaissance de panoramique recherche le début du mouvement de translation et continue de signaler le mouvement dans n'importe quelle direction au fil du temps, tandis qu'un module de reconnaissance de balayage prend une décision instantanée quant à savoir si les touches de l'utilisateur se déplacent linéairement dans la direction requise.

Par défaut, deux outils de reconnaissance ne reconnaîtront pas le même geste, il y a donc un conflit entre le panoramique et le balayage. Très probablement, votre outil de reconnaissance de panoramique «gagne» le conflit car son geste est plus simple / plus général: un balayage est un panoramique, mais un panoramique peut ne pas être un balayage, donc le panoramique reconnaît en premier et exclut les autres outils de reconnaissance.

Vous devriez être en mesure de résoudre ce conflit à l'aide de la méthode déléguée gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:, ou peut-être sans délégation en faisant dépendre le module de reconnaissance de panoramique du module de reconnaissance de balayage avec requireGestureRecognizerToFail:.

Une fois le conflit résolu, vous devriez pouvoir simuler un glissement à un doigt en faisant glisser rapidement la souris. (Bien que la souris soit plus précise que votre doigt, c'est un peu plus délicat que de faire la vraie chose sur un appareil.) Le panoramique / glissement à deux doigts peut être fait en maintenant les touches Option et Shift.

Rickster
la source
24
Bonne réponse. Mais je ne pense pas que le geste de panoramique gagne parce qu'il est plus général, mais plutôt parce que c'est un geste continu (où un balayage est un geste discret) donc un panoramique est reconnu avant un balayage. Le balayage n'est reconnu que sur le doigt levé, le panoramique est reconnu presque immédiatement après que le doigt commence à bouger. Swipe vs Pan est bien couvert dans le PG de l'événement sous "Déclarer un ordre spécifique pour deux reconnaisseurs de gestes".
nevan king
27

Le geste de balayage fonctionnera lorsque vous ne faites glisser votre doigt que dans certaines directions (balayez vers le haut, vers le bas, vers la gauche, vers la droite). Par exemple, les cellules à faire glisser dans le contrôleur de vue de tableau.

Pan Gesture fonctionnera lorsque vous faites glisser votre doigt dans toutes les directions. Vous pouvez lui donner une accélération ou une décélération. Par exemple, déplacer un objet d'un endroit à un autre ou faire tourner un spinner.

Daya Kevin
la source
3

Selon le document Apple. Apple UIPanGestureRecognizer La différence entre un panoramique et un balayage comme ci-dessous: -

UIPanGestureRecognizer est une sous-classe concrète de UIGestureRecognizer qui recherche les gestes de panoramique (glisser). L'utilisateur doit appuyer sur un ou plusieurs doigts sur une vue pendant qu'il effectue un panoramique. Les clients qui implémentent la méthode d'action pour ce module de reconnaissance de mouvement peuvent lui demander la traduction actuelle et la vitesse du mouvement.

Un geste de panoramique est continu. Il commence (a commencé ) lorsque le nombre minimum de doigts autorisés ( minimumNumberOfTouches ) a suffisamment bougé pour être considéré comme un pan. Il change (changé) lorsqu'un doigt bouge alors qu'au moins le nombre minimum de doigts est enfoncé. Il se termine ( terminé ) lorsque tous les doigts sont levés.

Les clients de cette classe peuvent, dans leurs méthodes d'action, interroger l'objet UIPanGestureRecognizer pour la traduction courante du geste ( translation (in :) ) et la vitesse de la traduction ( vitesse (in :) ). Ils peuvent spécifier la vue dont le système de coordonnées doit être utilisé pour les valeurs de translation et de vitesse. Les clients peuvent également réinitialiser la traduction à une valeur souhaitée.

Exemple de démonstration de Swift 3 UIPanGestureRecognizer: - Lien de ressource

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

Selon le document Apple. Apple UITapGestureRecognizer

UITapGestureRecognizer est une sous-classe concrète de UIGestureRecognizer qui recherche des taps simples ou multiples. Pour que le geste soit reconnu, le nombre de doigts spécifié doit toucher la vue un nombre spécifié de fois.

Bien que les taps soient des gestes discrets, ils sont discrets pour chaque état du dispositif de reconnaissance de gestes; ainsi le message d'action associé est envoyé lorsque le geste commence et est envoyé pour chaque état intermédiaire jusqu'à (et y compris) l'état de fin du geste. Le code qui gère les gestes de tap doit donc tester l'état du geste.

Swift 3 UITapGestureRecognizer Exemple de lien de ressource pour la démonstration

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

Exemple d'image pour la reconnaissanceentrez la description de l'image ici

Rex
la source
La question porte sur la différence entre les actions de panoramique et de balayage et comment les distinguer sur un simulateur iPhone. Cette réponse ne résout aucun de ces problèmes, car elle ne mentionne ni les gestes de balayage ni les simulateurs d'iPhone.
Vince O'Sullivan
@ VinceO'Sullivan Je vais essayer d'expliquer la définition de Pan and Swipe. J'espère que cela permettra de faire la différence entre les deux.
Rex
Le message d'origine a cinq ans et a une réponse acceptée (qui a également environ 200 votes positifs). Je ne pense pas qu'il y ait quoi que ce soit d'utile à ajouter (à moins qu'il y ait des différences entre la façon dont les choses fonctionnent maintenant et comment elles ont fonctionné dans la réponse acceptée).
Vince O'Sullivan
@ VinceO'Sullivan Je l'explique de manière simple avec un exemple simple et une définition de document Apple. Je pense que cela se concentre davantage sur le sujet et l'image montre le motif tactile dans iOS.
Rex
0

Selon http://hammerjs.github.io/ , je pense que la différence est:

  • panoramique: déplacez les directions dans la même grande vue
  • glisser: basculer entre plusieurs vues

Le geste est le même, tous les deux utilisent un doigt et bougent.

JasmineOT
la source