Qual é a diferença entre Pan e Swipe no iOS?

129

Parece simples. Segure o Trackpad, mova o dedo, solte . Mas, de alguma forma, o furto não está sendo acionado (a panorâmica é acionada)

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

Pan é reconhecido pela sequência acima.

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

Se pan é comentado, o furto é reconhecido pelo mesmo gesto. Com isso, duas perguntas:

  • Qual é a diferença então entre uma panela e um furto?
  • Como simular um furto no simulador do iPhone?
James Raitsev
fonte
1
@ Rickster, corrija-me se estiver errado, mas deslize com o dedo quatro direções: cima, baixo, esquerda, direita e panorâmica. Correto
Victor Engel

Respostas:

231

Por definição, um gesto de furto é necessariamente também um gesto de pan - ambos envolvem movimento translacional de pontos de contato. A diferença está na semântica do reconhecedor: um reconhecedor de panorâmica procura o início do movimento de translação e continua relatando movimento em qualquer direção ao longo do tempo, enquanto um reconhecedor de furto toma uma decisão instantânea sobre se os toques do usuário se moveram linearmente na direção requerida.

Por padrão, dois reconhecedores não reconhecerão o mesmo gesto, portanto, há um conflito entre deslocar e deslizar. Provavelmente, seu reconhecedor de pan "vence" o conflito porque seu gesto é mais simples / mais geral: um furto é um pan, mas um pan pode não ser um furto; portanto, o pan reconhece primeiro e exclui outros reconhecedores.

Você deve conseguir resolver esse conflito usando o método delegate gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:, ou talvez sem delegação, fazendo com que o reconhecedor de panorama dependa do reconhecedor de furto requireGestureRecognizerToFail:.

Com o conflito resolvido, você poderá simular um golpe de um dedo arrastando rapidamente o mouse. (Embora o mouse seja mais preciso que o seu dedo, é um pouco mais exigente do que fazer o que é real em um dispositivo.) É possível fazer movimentos panorâmicos / deslizar com dois dedos pressionando as teclas Option e Shift.

rickster
fonte
24
Boa resposta. Mas eu não acho que o gesto de panorâmica vence porque é mais geral, mas porque é um gesto contínuo (onde um furto é um gesto discreto), para que um pan seja reconhecido antes de um furto. O furto é reconhecido apenas no dedo que está sendo levantado, a panela é reconhecida quase imediatamente após o dedo começar a se mover. Swipe vs. Pan é bem coberto no PG do evento em "Declarando uma ordem específica para dois reconhecedores de gestos".
Nevan king
27

O gesto de deslizar funciona quando você arrasta o dedo apenas em determinadas direções (deslize para cima, deslize para baixo, deslize para a esquerda, deslize para a direita). Por exemplo, células comutáveis ​​no controlador de exibição de tabela.

O gesto de movimento panorâmico funciona quando você arrasta o dedo em qualquer direção. Você pode acelerar ou desacelerar. Por exemplo, mover um objeto de um lugar para outro ou girar um botão rotativo.

Daya Kevin
fonte
3

Conforme o documento da apple. Apple UIPanGestureRecognizer A diferença entre uma panela e um furto como abaixo: -

UIPanGestureRecognizer é uma subclasse concreta de UIGestureRecognizer que procura gestos de pan (arrastar). O usuário deve estar pressionando um ou mais dedos em uma vista enquanto o desloca. Os clientes que implementam o método de ação para esse reconhecedor de gestos podem solicitar a tradução e a velocidade atuais do gesto.

Um gesto de panorâmica é contínuo. Começa ( começa ) quando o número mínimo de dedos permitido ( minimumNumberOfTouches ) se moveu o suficiente para ser considerado um pan. Ele muda (muda) quando um dedo se move enquanto pelo menos o número mínimo de dedos é pressionado. Termina ( termina ) quando todos os dedos são levantados.

Os clientes dessa classe podem, em seus métodos de ação, consultar o objeto UIPanGestureRecognizer para a tradução atual do gesto ( tradução (em :) ) e a velocidade da tradução ( velocidade (em :) ). Eles podem especificar a vista cujo sistema de coordenadas deve ser usado para os valores de translação e velocidade. Os clientes também podem redefinir a tradução para o valor desejado.

Exemplo de demonstração do Swift 3 UIPanGestureRecognizer: - Link de recurso

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

Conforme o documento da apple. Apple UITapGestureRecognizer

UITapGestureRecognizer é uma subclasse concreta de UIGestureRecognizer que procura por toques únicos ou múltiplos. Para que o gesto seja reconhecido, o número especificado de dedos deve tocar na visualização um número especificado de vezes.

Embora os toques sejam gestos discretos, eles são discretos para cada estado do reconhecedor de gestos; assim, a mensagem de ação associada é enviada quando o gesto começa e é enviada para cada estado intermediário até (e inclusive) o estado final do gesto. O código que lida com gestos de toque deve, portanto, testar o estado do gesto.

Exemplo de demonstração do Swift 3 UITapGestureRecognizer Link do recurso

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

Imagem de exemplo para o reconhecedorinsira a descrição da imagem aqui

Rex
fonte
A pergunta é sobre a diferença entre ações de deslocar e deslizar e como distinguir entre elas em um simulador de iPhone. Esta resposta não resolve nenhum desses problemas, pois não menciona gestos de furto nem simuladores de iPhone.
Vince O'Sullivan
@ VinceO'Sullivan Vou tentar explicar a definição de Pan e Swipe. Espero que isso faça com que você entenda a diferença entre os dois.
Rex
A postagem original tem cinco anos e tem uma resposta aceita (que também tem cerca de 200 votos a mais). Eu não acho que exista algo útil para você adicionar (a menos que haja diferenças entre como as coisas funcionam agora e como elas funcionaram na resposta aceita).
Vince O'Sullivan
@ VinceO'Sullivan Explico de maneira fácil com um exemplo simples e definição de documento da apple. Eu acho que ele se concentra mais no tópico e na imagem mostra o padrão de toque no iOS.
Rex
0

De acordo com http://hammerjs.github.io/ , acho que a diferença é:

  • panorâmica: mova as direções na mesma visualização grande
  • deslize: alterne entre várias visualizações

O gesto é o mesmo, ambos usam um dedo e se movem.

JasmineOT
fonte