Cómo reconocer el gesto de deslizar en UIScrollView

Intento reconocer el gesto de deslizar izquierda / derecha en UIScrollView . Intenté crear UISwipeGestureRecognizers y asociarlos a la vista de desplazamiento. Funciona pero muy raramente. La mayoría de las veces no me llaman. ¿Por qué?

¿Cómo puedo pasar de izquierda a derecha / derecha para trabajar? ¿Puedo usar los reconocedores de gestos o tengo que manejarlo de alguna manera en touchesBegan/Ended

Gracias

Lo averigué. En mi caso, mi UIScrollView contenía un UIImage que permití hacer zoom. Aparentemente, eso significaba que el desplazamiento estaba habilitado y UIScrollView tenía problemas para distinguir entre los gestos destinados a desplazarse frente a deslizar (siguiente, imagen anterior).

La clave en mi caso es deshabilitar el desplazamiento en la vista de desplazamiento cuando la imagen no está ampliada, y cambiar el nombre de la imagen cuando se amplía. Esto proporciona el comportamiento esperado.

La pieza crítica es poner lo siguiente en el delegado de la vista de desplazamiento:

 - (void)scrollViewDidZoom:(UIScrollView *)scrollView { if (scrollView.zoomScale!=1.0) { // Zooming, enable scrolling scrollView.scrollEnabled = TRUE; } else { // Not zoomed, disable scrolling so gestures get used instead scrollView.scrollEnabled = FALSE; } } 

También tengo que inicializar la vista de desplazamiento con desplazamiento deshabilitado. Para habilitar el zoom, simplemente proporcione una imagen en una llamada de delegado,

 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { // Return the scroll view return myImage; } 

Y configure algunos parms en viewDidLoad para el zoom y los reconocedores de gestos de configuración también

 - (void)viewDidLoad { [super viewDidLoad]; myScrollView.contentSize = CGSizeMake(myImage.frame.size.width, myImage.frame.size.height); myScrollView.maximumZoomScale = 4.0; myScrollView.minimumZoomScale = 1.0; myScrollView.clipsToBounds = YES; myScrollView.delegate = self; [myScrollView addSubview:myImage]; [self setWantsFullScreenLayout:TRUE]; myScrollView.scrollEnabled = FALSE; UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; recognizer.delaysTouchesBegan = TRUE; [myScrollView addGestureRecognizer:recognizer]; [recognizer release]; recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; recognizer.direction = UISwipeGestureRecognizerDirectionLeft; [myScrollView addGestureRecognizer:recognizer]; [recognizer release]; [myScrollView delaysContentTouches]; } 
 UIScrollView *scrollView = ... UISwipeGestureRecognizer *mySwipe = ... 

La solución correcta para solucionar este problema es agregar una línea de código:

 [scrollView.panGestureRecognizer requireGestureRecognizerToFail:mySwipe] 

Versión Swift:

 scrollView.panGestureRecognizer.requireGestureRecognizerToFail(mySwipe) 

Versión Swift4:

 scrollView.panGestureRecognizer.require(toFail: mySwipe!); 

Buen post.

Estaba haciendo algo similar (sin vista de imagen) y básicamente tuve que deshabilitar el desplazamiento si contentSize era más pequeño que la altura (mi vista de desplazamiento solo se desplaza verticalmente).

 if (scrollView.contentSize.height>scrollView.frame.size.height) { scrollView.scrollEnabled = YES; } else { scrollView.scrollEnabled = NO; } 

Eso hizo el truco para mí