Jaka jest różnica między przesuwaniem i przesuwaniem w iOS?


132

Brzmi prosto. Przytrzymaj gładzik, przesuń palec, puść .

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

Pan jest rozpoznawany przez powyższą sekwencję.

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

Jeśli komentarz jest komentowany, przesunięcie jest rozpoznawane przez ten sam gest. W ten sposób otrzymujemy 2 pytania:

  • Jaka jest zatem różnica między patelnią a machnięciem?
  • Jak można zasymulować przesunięcie na symulatorze iPhone'a?

2
@rickster, popraw mnie, jeśli się mylę, ale przesuwanie używa czterech kierunków: w górę, w dół, w lewo, w prawo i przesuwanie w dowolnym kierunku. Poprawnie
Victor Engel,

Odpowiedzi:


235

Z definicji gest machnięcia musi być również gestem przesuwania - oba obejmują ruch translacyjny punktów dotykowych. Różnica tkwi w semantyce aparatu rozpoznawania: moduł rozpoznawania panoramy szuka początku ruchu translacyjnego i nadal zgłasza ruch w dowolnym kierunku w czasie, podczas gdy aparat rozpoznawania przesunięć podejmuje natychmiastową decyzję, czy dotknięcia użytkownika zostały przesunięte liniowo w wymaganym kierunku.

Domyślnie żadne dwa aparaty rozpoznające nie rozpoznają tego samego gestu, więc występuje konflikt między przesuwaniem a przesuwaniem. Najprawdopodobniej twój aparat rozpoznawania panoramy „wygrywa” konflikt, ponieważ jego gest jest prostszy / bardziej ogólny: przesunięcie to przesunięcie, ale przesunięcie może nie być przesunięciem, więc panorama rozpoznaje najpierw i wyklucza inne urządzenia rozpoznające.

Powinno być możliwe rozwiązanie tego konfliktu przy użyciu metody delegata gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:lub bez delegowania, uzależniając aparat rozpoznawania panoramy od aparatu rozpoznawania przesunięcia za pomocą requireGestureRecognizerToFail:.

Po rozwiązaniu konfliktu powinieneś być w stanie zasymulować przesunięcie jednym palcem, szybko przeciągając myszą. (Chociaż mysz jest bardziej precyzyjna niż palec, jest to nieco bardziej skomplikowane niż robienie prawdziwych rzeczy na urządzeniu). Przesuwanie / przesuwanie dwoma palcami można wykonać, przytrzymując klawisze Option i Shift.


24
Niezła odpowiedź. Ale nie sądzę, że wygrywa gest przesuwania, ponieważ jest bardziej ogólny, ale raczej dlatego, że jest to gest ciągły (gdzie przesunięcie jest gestem dyskretnym), więc panorama jest rozpoznawana przed machnięciem. Przesunięcie jest rozpoznawane tylko na podniesionym palcu, patelnia jest rozpoznawana niemal natychmiast po tym, jak palec zacznie się poruszać. Swipe vs. Pan jest dobrze opisana w PG wydarzenia w sekcji „Deklarowanie określonej kolejności dla dwóch urządzeń do rozpoznawania gestów”.
nevan king

27

Gest machnięcia działa, gdy przeciągasz palcem tylko w określonych kierunkach (przesuń w górę, przesuń w dół, przesuń w lewo, przesuń w prawo). Na przykład komórki, które można przesuwać w kontrolerze widoku tabeli.

Gest przesuwania działa, gdy przeciągasz palcem w dowolnych kierunkach. Możesz nadać mu przyspieszenie lub spowolnienie. Na przykład przenoszenie obiektu z jednego miejsca w drugie lub obracanie przędzarki.


3

Zgodnie z dokumentem Apple. Apple UIPanGestureRecognizer Różnica między panoramą a machnięciem, jak poniżej: -

UIPanGestureRecognizer to konkretna podklasa UIGestureRecognizer, która szuka gestów przesuwania (przeciągania). Podczas przesuwania widoku użytkownik musi naciskać jeden lub więcej palców. Klienci implementujący metodę akcji dla tego aparatu rozpoznawania gestów mogą poprosić go o bieżące tłumaczenie i szybkość gestu.

Gest przesuwania jest ciągły. Zaczyna się ( rozpoczął ), gdy minimalna liczba palców dozwolone ( minimumNumberOfTouches ) przeniósł się na tyle, aby uznać patelni. Zmienia się (zmienia), gdy palec porusza się, gdy przynajmniej minimalna liczba palców jest wciśnięta. Kończy się ( kończy ), gdy wszystkie palce są uniesione.

Klienci tej klasy mogą, w swoich metodach akcji, wysyłać zapytania do obiektu UIPanGestureRecognizer o bieżące tłumaczenie gestu ( translacja (w :) ) i prędkość tłumaczenia ( prędkość (w :) ). Mogą określić widok, którego układ współrzędnych powinien być użyty dla wartości przesunięcia i prędkości. Klienci mogą również zresetować tłumaczenie do żądanej wartości.

Przykład demo Swift 3 UIPanGestureRecognizer: - Link do zasobów

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

Zgodnie z dokumentem Apple. Apple UITapGestureRecognizer

UITapGestureRecognizer to konkretna podklasa UIGestureRecognizer, która wyszukuje pojedyncze lub wielokrotne dotknięcia . Aby gest został rozpoznany, określona liczba palców musi stuknąć widok określoną liczbę razy.

Chociaż stuknięcia są gestami dyskretnymi, są one odrębne dla każdego stanu aparatu rozpoznawania gestów; w ten sposób skojarzony komunikat akcji jest wysyłany, gdy gest się zaczyna i jest wysyłany dla każdego stanu pośredniego aż do (włącznie) stanu końcowego gestu. Kod, który obsługuje gesty stuknięcia, powinien zatem sprawdzać stan gestu.

Swift 3 UITapGestureRecognizer Przykładowy link do zasobu

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

Przykładowy obraz dla narzędzia do rozpoznawaniawprowadź opis obrazu tutaj


Pytanie dotyczy różnicy między operacjami przesuwania i przesuwania oraz jak je rozróżnić w symulatorze iPhone'a. Ta odpowiedź nie rozwiązuje żadnego z tych problemów, ponieważ nie wspomina ani o gestach machnięcia, ani o symulatorach iPhone'a.
Vince O'Sullivan

@ VinceO'Sullivan Postaram się wyjaśnić definicję Pan i Swipe. Mam nadzieję, że dzięki temu zrozumiemy rozróżnienie między nimi.
Raksha Saini

Oryginalny post ma pięć lat i ma zaakceptowaną odpowiedź (która również ma około 200 głosów pozytywnych). Myślę, że nie ma nic przydatnego do dodania (chyba że istnieją różnice między tym, jak rzeczy działają teraz, a jak działały w zaakceptowanej odpowiedzi).
Vince O'Sullivan

@ VinceO'Sullivan Wyjaśniam to w prosty sposób za pomocą prostego przykładu i definicji dokumentu Apple. Myślę, że skupia się bardziej zarówno na temacie, jak i na zdjęciu pokazuje wzór dotykowy w iOS.
Raksha Saini

0

Według http://hammerjs.github.io/ , myślę, że różnica jest taka:

  • panoramowanie: przesuwaj kierunki w tym samym dużym widoku
  • machnięcie: przełączanie między kilkoma widokami

Gest jest taki sam, obaj używają jednego palca i ruchu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.