Dile a ScrollView que se desplace después de otro gesto de paneo.

Tengo problemas para get una vista de desplazamiento (dentro de una vista de tabla) para desplazarme. Básicamente, tengo una instrucción if que verifica si el movimiento horizontal es mayor que el movimiento vertical. Si es así, se ejecuta un gesto de paneo en la celda. De lo contrario, me gustaría que la vista de tabla se desplace normalmente. He intentado usar alguna variación de self.scrollview.enabled = yes pero no pude hacerlo funcionar.

Funciona bien para el gesto panorámico horizontal, pero no puedo hacer que se desplace correctamente en la sección else. Aquí está el código más relevante: (perdón si es terrible, todavía soy nuevo en iOS / Objective C). Ah, y si ve un extraño 'código' aleatoriamente en el extracto de código, ignórelo, tuve algunos problemas para formatearlo y perdí una palabra.

 -(void)handlePan:(UIPanGestureRecognizer *)panGestureRecognizer { CGPoint location = [panGestureRecognizer locationInView:_tableView]; //Get the corresponding index path within the table view NSIndexPath *indexPath = [_tableView indexPathForRowAtPoint:location]; TVTableCell *cell = [_tableView cellForRowAtIndexPath:indexPath]; CGPoint translation = [panGestureRecognizer translationInView:cell]; // Check for horizontal gesture if (fabsf(translation.x) > fabsf(translation.y)) { CGPoint originalCenter = cell.center; if (panGestureRecognizer.state == UIGestureRecognizerStateBegan) { NSLog(@"pan gesture started"); } if (panGestureRecognizer.state == UIGestureRecognizerStateChanged) { // translate the center CGPoint translation = [panGestureRecognizer translationInView:self.view]; if (translation.x > 0) { cell.center = CGPointMake(originalCenter.x + (translation.x-(translation.x-3)), originalCenter.y); } else { cell.center = CGPointMake(originalCenter.x + (translation.x-(translation.x+3)), originalCenter.y); } // determine whether the item has been dragged far enough to initiate a delete / complete //this will be implemented eventually // _deleteOnDragRelease = self.frame.origin.x < -self.frame.size.width / 2; NSLog(@"state changed"); } if (panGestureRecognizer.state == UIGestureRecognizerStateEnded) { // the frame this cell would have had before being dragged CGRect originalFrame = CGRectMake(0, cell.frame.origin.y, cell.bounds.size.width, cell.bounds.size.height); // if (!_deleteOnDragRelease) { // if the item is not being deleted, snap back to the original location [UIView animateWithDuration:0.2 animations:^{ cell.frame = originalFrame; } ]; } } else { //else: scroll tableview normally NSLog(@"dear god act normally"); } } 

Gracias por la ayuda, todas las sugerencias son bienvenidas.

No me gusta mucho el UITableView pero creo que el problema es que al asignar tu UIPanGestureRecognizer personalizado a _tableView básicamente estás invalidando el valor pnetworkingeterminado. De todos modos sea la razón por la que puedas resolverlo de esta manera.

Supongamos que hace todo en el ViewController, incluso si está bastante sucio.

Haga que su ViewController cumpla con el protocolo UIGestureRecognizerDelegate

En su ViewController.m anule el gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: method.

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

Como dice la documentation:

Pregunta al delegado si a dos reconocedores de gestos se les debe permitir reconocer gestos al mismo time.

Valor de retorno
SÍ para permitir que gestureRecognizer y otherGestureRecognizer reconozcan sus gestos simultáneamente. La implementación pnetworkingeterminada devuelve NO: no se pueden reconocer dos gestos simultáneamente.

De esta forma, se ejecutará tanto su reconocedor de bandeja como el UITableView pnetworkingeterminado.

Lo último que debe hacer es configurar ViewController como delegado para UIPanGestureRecognizer :

 UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; panRecognizer.delegate = self; 

Nota: esta es la solución rápida y más sucia que podrías implementar. Una mejor solución podría ser cambiar la lógica de seguimiento de gestos a la propia célula, o subclass UIPanGestureRecognizer . Eche un vistazo a esta respuesta también.