Obtenga Deslizar para eliminar en UITableView para trabajar con UIPanGestureRecognizer

Tengo un UIPanGuestureRecognizer agregado a la vista completa usando este código:

UIPanGestureRecognizer *pgr = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)]; [[self view] addGestureRecognizer:pgr]; 

Dentro de la vista principal, tengo una UITableView que tiene este código para habilitar la function de deslizar para borrar:

 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"RUNNING2"); return UITableViewCellEditingStyleDelete; } - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row >= _firstEditableCell && _firstEditableCell != -1) NSLog(@"RUNNING1"); return YES; else return NO; } 

Solo RUNNING1 se imprime en el logging y el button Eliminar no aparece. Creo que la razón de esto es el UIPanGestureRecognizer, pero no estoy seguro. Si esto es correcto, ¿cómo debería solucionarlo? Si esto no es correcto, proporcione la causa y solucione. Gracias.

Del documento :

Si un gestor reconocedor reconoce su gesto, los toques restantes para la vista se cancelan.

Su UIPanGestureRecognizer reconoce el gesto de deslizar primero, por lo que su UITableView ya no recibe toques.

Para que la vista de tabla se toque, toque simultáneamente con el reconocimiento de gestos, agréguelo al delegado del reconocimiento de gestos:

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

Si está utilizando UIPanGuestureRecognizer, por ejemplo, para mostrar el menu lateral, es posible que vea algunos efectos secundarios no deseados cuando acaba de devolver SÍ en todos los casos, tal como se propone en la respuesta aceptada. Por ejemplo, la apertura del menu lateral cuando se desplaza hacia arriba / abajo en la vista de la tabla (con una dirección izquierda / derecha adicional muy pequeña) o el button Eliminar se comporta de forma extraña cuando abre el menu lateral. Lo que puede hacer para evitar estos efectos secundarios es permitir solo gestos horizontales simultáneos. Esto hará que el button de eliminar funcione correctamente pero al mismo time se bloquearán otros gestos no deseados al deslizar el menu.

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { UIPanGestureRecognizer *panGesture = (UIPanGestureRecognizer *)otherGestureRecognizer; CGPoint velocity = [panGesture velocityInView:panGesture.view]; if (ABS(velocity.x) > ABS(velocity.y)) return YES; } return NO; } 

o en Swift:

 func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { guard let panRecognizer = otherGestureRecognizer as? UIPanGestureRecognizer else { return false } let velocity = panRecognizer.velocity(in: panRecognizer.view) if (abs(velocity.x) > abs(velocity.y)) { return true } return false }