recognizer cocoa-touch uiview ipad uigesturerecognizer

cocoa touch - UIGestureRecognizer que bloquea el desplazamiento de la vista de tabla



tap gesture recognizer swift 4 (4)

Estoy usando una subclase UIGestureRecognizer personalizada para seguir los gestos en mi clase de InfoView . La clase InfoView es una subvista de una subclase personalizada UITableViewCell llamada InfoCell .

Agregué mi reconocedor de gestos a mi vista raíz (la vista principal de todo lo demás en la pantalla, porque el propósito de mi reconocedor de gestos personalizado es permitir el arrastre de InfoCell vistas de InfoCell entre las tablas). Ahora, todo funciona como debería, excepto una cosa. Estoy usando el siguiente código en mi subclase UIGestureRecognizer para detectar toques en la vista de InfoView :

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UIView *touchView = [[touches anyObject] view]; if ([touchView isKindOfClass:[InfoView class]]) { // Do stuff }

El problema aquí es que los toques en el objeto InfoView están siendo interceptados, por lo tanto, no se están UITableView a UITableView que contiene InfoCell , que es la vista principal de InfoView . Esto significa que ya no puedo desplazarme por la vista de tabla arrastrando en la vista de InfoView , que es un problema porque InfoView cubre todo el InfoCell .

¿Hay alguna forma de que pueda reenviar los toques a la vista de tabla para que pueda desplazarse? Ya intenté un montón de cosas:

[super touchesBegan:touches withEvent:event];

[touchView.superview.superview touchesBegan:touches withEvent:event]; ( touchView.superview.superview obtiene una referencia a su padre UITableView )

Pero nada ha funcionado hasta ahora. Además, la cancelsTouchesInView de mi UIGestureRecognizer se establece en NO , por lo que no interfiere con los toques.

La ayuda es apreciada. ¡Gracias!


Tuve una línea en mi método touchesBegan que establece la propiedad de state del reconocedor de gestos en UIGestureRecognizerStateBegan . Eliminar esta línea parece solucionar el problema.


UIGestureRecognizer tiene una propiedad "cancelsTouchesInView" que está establecida en SÍ de manera predeterminada. Esto significa que los toques en una UIView se cancelan cuando se reconoce un gesto. Intente configurarlo en NO para permitir que UIScrollView reciba más eventos táctiles.


Consulte el método UIGestureRecognizerDelegate: - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

Si esto retorna SÍ, evitará que su reconocedor de gestos pisotee el que usa UIScrollView para detectar el desplazamiento.


Puedes intentar agregar esta notificación

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if ([gestureRecognizer class] == [UIPanGestureRecognizer class]) { UIPanGestureRecognizer *panGestureRec = (UIPanGestureRecognizer *)gestureRecognizer; CGPoint point = [panGestureRec velocityInView:self]; if (fabsf(point.x) > fabsf(point.y) ) { return YES; } } return NO; }