uiscrollview uiscrollviewdelegate

GestureRecognizers que no reciben eventos táctiles mientras UIScrollView se desacelera



uiscrollviewdelegate (1)

Tengo un UICollectionView de desplazamiento horizontal poblado con UITableViews de desplazamiento vertical (ambas subclases de UISCrollView). Cuando un gesto de desplazamiento comienza a desplazarse en cualquier dirección, no se reconocen otros reconocedores de gesto hasta que se desacelera.

Por lo tanto, si me desplazo horizontalmente de una tabla a la siguiente y luego trato de desplazar verticalmente la tabla vista antes de que finalice la desaceleración, continuará desplazándose horizontalmente. Esto es muy frustrante


Puede obtener dos reconocedores de gestos para que funcionen simultáneamente al implementar el método UIGestureRecognizerDelegate:

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

Sin embargo, dado que el delegado para los reconocedores de gestos incorporados para UIScrollView DEBE ser el propio UIScrollView, debe subclase UIScrollView (o UITableView, o UICollectionView) para implementar este método delegado.

Un poco derrota el propósito de la delegación.

De todos modos, ahora que ambos UIScrollViews reconocen los gestos simultáneamente, necesitamos una forma de distinguir los gestos de desplazamiento horizontal de los verticales y asegurarnos de que la vista de desplazamiento apropiada maneje el gesto apropiado.

Una solución rápida fue crear un reconocedor de gestos de barrido vertical y exigir que fallara para que los reconocedores de gestos incorporados en la vista de colección horizontal reconocieran.

UISwipeGestureRecognizer* verticalSwipe = [[UISwipeGestureRecognizer alloc] init]; verticalSwipe.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp; verticalSwipe.delegate = self; for (UIGestureRecognizer *gesture in self.collectionView.gestureRecognizers){ [gesture requireGestureRecognizerToFail:verticalSwipe]; } [self.collectionView addGestureRecognizer:verticalSwipe];

Luego, haga lo mismo con TableView vertical, agregue un gesto de deslizamiento horizontal y solicite que falle para que los reconocedores integrados de tableView entren en funcionamiento.

UISwipeGestureRecognizer* horizontalSwipe = [[UISwipeGestureRecognizer alloc] init]; horizontalSwipe.direction = UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight; horizontalSwipe.delegate = self; for (UIGestureRecognizer *gesture in tableView.gestureRecognizers){ [gesture requireGestureRecognizerToFail:horizontalSwipe]; } [tableView addGestureRecognizer:horizontalSwipe];

Agregar:

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

Para AMBOS, la colección View y tableView ayudaron a refinar aún más el comportamiento de los gestos.