Mam widok, który ma UIPanGestureRecognizer
przeciągnąć widok w pionie. Tak więc w wywołaniu zwrotnym aparatu rozpoznawania aktualizuję tylko współrzędną y, aby ją przenieść. Nadzór tego widoku ma opcję, UIPanGestureRecognizer
która przeciąga widok poziomo, po prostu aktualizując współrzędną x.
Problem polega na tym, że pierwszy UIPanGestureRecognizer
polega na tym, że zdarzenie przesuwa widok w pionie, więc nie mogę użyć gestu superview.
próbowałem
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer *)otherGestureRecognizer;
i oba będą działać, ale tego nie chcę. Chcę, aby poziomo był wykrywany tylko wtedy, gdy ruch jest wyraźnie poziomy. Byłoby więc wspaniale, gdyby UIPanGestureRecognizer
miał właściwość kierunku.
Jak mogę osiągnąć takie zachowanie? Uważam, że dokumentacja jest bardzo zagmatwana, więc może ktoś może to lepiej wyjaśnić tutaj.
źródło
Odpowiedzi:
Po prostu zrób to dla rozpoznawania gestów przesuwania w pionie, działa dla mnie:
A dla Swift:
źródło
velocityInView
zamiasttranslationInView
.Stworzyłem rozwiązanie z podklasą, jak w odpowiedzi podanej przez @LocoMike, ale wykorzystałem bardziej skuteczny mechanizm wykrywania poprzez prędkość początkową, jaką zapewnia @Hejazi. Używam również języka Swift, ale w razie potrzeby powinno to być łatwe do przetłumaczenia na Obj-C.
Zalety w stosunku do innych rozwiązań:
Oto kod:
Przykład użycia:
źródło
UIPanGestureRecognizer
.let horizontalPanRecognizer = PanDirectionGestureRecognizer(direction: .horizontal, target: self, action: #selector(handleHorizontalPanGesture(recognizer:))) self.view?.addGestureRecognizer(horizontalPanRecognizer); let verticalPanRecognizer = PanDirectionGestureRecognizer(direction: .vertical, target: self, action: #selector(handleVerticalPanGesture(recognizer:))) self.view?.addGestureRecognizer(verticalPanRecognizer);
Rozgryzłem to, tworząc podklasę UIPanGestureRecognizer
DirectionPanGestureRecognizer:
DirectionPanGestureRecognizer.m:
Spowoduje to wyzwolenie gestu tylko wtedy, gdy użytkownik zacznie przeciągać wybrane zachowanie. Ustaw właściwość direction na poprawną wartość i gotowe.
źródło
initWithTarget:action:
metodę i wywołałem reset i wszystko było dobrze.DirectionPanGestureRecognizer
zignoruje szybkie przeciąganie, chyba że ustawiszkDirectionPanThreshold = 20
lub tak, w takim przypadku może to dać fałszywe alarmy. Proponuję odpowiednio wstawićabs(_moveX) > abs(_moveY)
zamiastabs(_moveX) > kDirectionPanThreshold
i zmienić wielkość liter poziomych._drag = YES
którą dodałemself.state = UIGestureRecognizerStateChanged;
Próbowałem ograniczyć prawidłowy obszar w poziomie za pomocą UIPanGestureRecognizer.
Następnie tylko przesunięcie w poziomie w zakresie ProguAngle stopień może wywołać ten gest przesunięcia .
źródło
Odpowiedź Swift 3.0: tylko uchwyty wykonuje gest pionowy
źródło
Poniższe rozwiązanie rozwiązało mój problem:
W rzeczywistości jest to po prostu sprawdzenie, czy panoramowanie odbywa się w widoku głównym lub tableView.
źródło
Szybka 3 wersja odpowiedzi Lee dla leniwych
źródło
Wziąłem Lee Goodrich „s odpowiedź i rozszerzyła je jako musiałem specjalnie jednym kierunku patelni. Użyj tego w ten sposób:
let pan = PanDirectionGestureRecognizer(direction: .vertical(.up), target: self, action: #selector(handleCellPan(_:)))
Dodałem też kilka komentarzy, aby trochę jaśniej określić, jakie decyzje są faktycznie podejmowane.
źródło
override func touchesMoved
-Method does not override any method from its superclass
.Można znaleźć kierunek przeciąganie
UIView
przezUIPanGestureRecognizer
. Proszę postępować zgodnie z kodem.źródło
Swift 4.2
Rozwiązaniem jest tylko obsługa gestów przesuwania w pionie, tak samo jak w poziomie.
Rozwiązanie 1 :
Rozwiązanie 2:
Następnie gest machnięcia połknie gest przesunięcia. Oczywiście nie musisz nic robić w
swipeAction
.źródło
Oto jak rozwiązałem:
Najpierw włączyłem jednoczesne rozpoznawanie PanGesture.
Następnie izoluję gesty przesunięcia w poziomie i w pionie (akumulator jest właściwością NSMutableArray):
Podałem tutaj przykład:
dodaj niestandardową panoramę w widoku przewijania
źródło
źródło
Możesz użyć prostego
panGestureRecognizer
. Nie ma potrzeby używaniapandirectionregognizer
ani rzeczy. Po prostu użyj wartości ytranslationInview
poniższego kodu, przesuń widok przeciągania tylko w górę iw dółźródło
Stworzyłem metodę akcji PanGestureRecognizer @selector dla obiektu, który wymagał tylko przewijania w poziomie.
źródło
Szybki sposób
źródło
Dla wszystkich użytkowników Swift, to wystarczy :)
źródło
Przyjąłem doskonałą odpowiedź Lee Goodricha i przeportowałem na Swift 3
źródło
Chciałbym podzielić się moim podejściem, ponieważ wszystkie inne podejścia są oparte na klasach
UIGestureRecognizerDelegate
albo na podklasachUIPanGestureRecognizer
.Moje podejście opiera się na środowisku wykonawczym i swizzlingu. Nie jestem w 100% pewien co do tego podejścia, ale możesz je samodzielnie przetestować i poprawić.
Ustaw kierunek dowolnego za
UIPanGestureRecognizer
pomocą tylko jednej linii kodu:użyj
pod 'UIPanGestureRecognizerDirection'
lub kod:źródło
Spróbowałem tego: co zadziałało dla mnie zgodnie z opisem pytania
źródło
SWIFT 4.2
Poszedłem dalej i wskazałem kierunek Pan Gest:
(Używany: https://github.com/fastred/SloppySwiper i https://stackoverflow.com/a/30607392/5790492 )
źródło
Oto niestandardowy gest przesuwania w Swift 5
U może ograniczyć jego kierunek i maksymalny kąt w tym kierunku, możesz również ograniczyć jego minimalną prędkość w tym kierunku.
zadzwoń tak:
lub
źródło
PanGestureRecognizer
interfejs zawiera następujące definicje:Nie sprawdzałem tego, ale może jest to dostępne przez podklasę.
źródło