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?
ios
gesture-recognition
gestures
James Raitsev
źródło
źródło
Odpowiedzi:
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.
źródło
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.
źródło
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 rozpoznawania
źródło
Według http://hammerjs.github.io/ , myślę, że różnica jest taka:
Gest jest taki sam, obaj używają jednego palca i ruchu.
źródło