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