Przechwytywanie gestów pan nad UIScrollView przerywa przewijanie

Mam przewijanie pionowe UIScrollView. Chcę również obsługiwać poziome Pan, jednocześnie zezwalając na domyślne zachowanie przewijania w pionie. Umieściłem przezroczysty UIView nad widokiem przewijania i dodałem do niego rozpoznawanie gestów przesuwania. W ten sposób mogę uzyskać pan, ale wtedy widok przewijania nie odbiera żadnych gestów.

Zaimplementowałem następujące metody UIPanGestureRecognizerDelegate, mając nadzieję ograniczyć rozpoznawanie gestów tylko do poziomych patelni, 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);
}
Author: Macondo2Seattle, 2012-12-06

3 answers

Ok, rozgryzłem to. Musiałem zrobić 2 rzeczy, aby to zadziałało:

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

2) ta metoda UIGestureRecognizerDelegate zapobiega głupkowatemu zachowaniu, które dzieje się, gdy zarówno domyślny scrollview, jak i mój własny są wywoływane jednocześnie.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}
 36
Author: Macondo2Seattle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-22 18:49:27

Miałem ten sam problem do rozwiązania i zrobiłem to:

1) Dołącz mój własny rozpoznawacz pan do widoku przewijania.

2) Return YES on: - gestureRecognizer: shouldRecognizeSimultaneouslyWithgesturerecognizer:

Pozwoli to na działanie obu gestów. Oznacza to, że przy przewijaniu pionowym zarówno delegat panGesture, jak i delegat scrollView zostaną zwolnione. Jeśli jest to przewijanie poziome, wywoła tylko Twojego delegata panGesture.

3) in my panGesture deleguj, Wykryj, czy jest to przewijanie poziome, jeśli nie, zignoruj.

 12
Author: tony.tc.leung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-12 21:12:41

Szybka Odpowiedź:

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
    }
}
 1
Author: bnussey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-08 00:21:34