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);
}
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;
}
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.
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
}
}
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