33

Mam przewijanie w pionie UIScrollView. Chcę również obsługiwać poziome patelnie, pozwalając na domyślne zachowanie pionowego przewijania. Umieściłem przezroczysty widok UIView nad widokiem przewijania i dodałem do niego rozpoznawcę gestu panoramowania. W ten sposób mogę uzyskać patelnie w porządku, ale wtedy widok przewijania nie otrzymuje żadnych gestów.Przechwytywanie gestów panoramy przez UIScrollView przerywa przewijanie

I zostały wdrożone następujące UIPanGestureRecognizerDelegate metod, chcąc ograniczyć mój gest rozpoznawania tylko do patelni poziomych, ale to nie pomogło:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer 
{ 
    // Only accept horizontal pans here. 
    // Leave the vertical pans for scrolling the content. 
    CGPoint translation = [gestureRecognizer translationInView:self.view]; 
    BOOL isHorizontalPan = (fabsf(translation.x) > fabsf(translation.y)); 
    return isHorizontalPan; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return (otherGestureRecognizer == _scrollView.panGestureRecognizer); 
} 
+1

Czy próbowałeś '[panGesture setCancelsTouchesInView: NO];'? Samo zwracanie TAK w 'shouldRecognizeSimultaneouslyWithGestureRecognizer' może pomóc ci znaleźć przyczynę problemu. –

+0

Po prostu wypróbowałem, bez różnicy. – Macondo2Seattle

Odpowiedz

33

OK I zdobione. Musiałem zrobić 2 rzeczy, aby to zadziałało:

1) Dołącz mój własny system rozpoznawania panewek do samego widoku przewijania, a nie do innego widoku na nim.

2) Ta metoda UIGestureRecognizerDelegate zapobiega głupkowatemu zachowaniu, które ma miejsce, gdy zarówno domyślny przewijany widok, jak i mój własny są wywoływane jednocześnie.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 
+2

domyślnym zachowaniem metody ShouldRecognizeSimultaneouslyWithGestureRecognizer jest zwrócenie NIE, więc dodanie jest niepotrzebne –

+4

zmienić wartość zwracaną na "TAK" i działa dobrze. –

11

miałem ten sam problem do rozwiązania i zrobiłem tak:

1) Zamontuj własne pan rozpoznawania do widoku przewijania.

2) Powrót na TAK: - gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:

To pozwoli obu gesty do pracy. Oznacza to, że przy przewijaniu w pionie zarówno delegacja panGesture, jak i delegenda scrollView zostaną odpalone. Jeśli jest to poziome zwoje, zadzwoni tylko do delegata panGesture.

3) w mojej delegacji panGesture, wykryj, czy jest to poziome przewijanie, jeśli nie jest, zignoruj.

+1

To jest dokładnie to samo, co polecam w mojej własnej odpowiedzi. – Macondo2Seattle

+11

@ BlackRider to nie jest. To zwraca TAK –

+0

Dzięki 'gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer' zrobił lewę. – atulkhatri

0

odpowiedź Swift:

let scrollViewPanGesture = UIPanGestureRecognizer(target: self, action: #selector(onPan(_:))) 
scrollViewPanGesture.delegate = self 
scrollView.addGestureRecognizer(scrollViewPanGesture) 

extension ViewController: UIGestureRecognizerDelegate { 
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
     return true 
    } 
} 
Powiązane problemy