2010-09-06 12 views
22

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

¿Cómo puedo deslizarme de manera confiable hacia la izquierda/derecha para trabajar? ¿Puedo utilizar los reconocedores gesto o tengo que manejar de alguna manera a mí mismo en touchesBegan/Ended

Gracias

Respuesta

38

descubierto. 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 cuando se acerca. Esto proporciona el comportamiento esperado.

La pieza fundamental 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 iniciar la vista de desplazamiento con desplazamiento deshabilitado. Para activar el zoom, sólo tiene que proporcionar una imagen en una llamada delegado,

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

y establecer un par de parms en viewDidLoad de los reconocedores de zoom y configuración, así gesto

- (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]; 
} 
+0

realmente excelente encontrar David. mis reconocedores de barrido tampoco funcionaron. Me rendí y utilicé touchesBegan: con NSNotification, pero también notificaba a MasterViewControllers (en el iPad). Tenía la vista borrosa de buscar ese problema. ¡Ahorraste mi tiempo n energía! sincero gracias David. Sigue publicando trucos ... ten un gran día. – gopikrishnan

+0

Gracias por el truco – iOSAppDev

+0

O tal vez en una línea - scrollView.scrollEnabled = (scale! = 1.0f) – Yariv

4

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

Que hizo el truco para mí

24
UIScrollView *scrollView = ... 
UISwipeGestureRecognizer *mySwipe = ... 

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

[scrollView.panGestureRecognizer requireGestureRecognizerToFail:mySwipe] 

versión Swift:

scrollView.panGestureRecognizer.requireGestureRecognizerToFail(mySwipe) 
+0

¡Definitivamente de acuerdo en que esta es la solución correcta! También tengo que agregar en la misma línea para el 'pinchGestureRecognizer' para que sea confiable ya que estaba tratando de detectar un deslizamiento de varios dedos. –

+0

Definitivamente, este parece ser el camino correcto a seguir. A veces encuentro que el gesto de deslizar se dispara demasiado rápido, pero ahora es un problema con el controlador de deslizamiento. Al menos no tenemos que hacer todo tipo de cosas extrañas y hacky que otras personas sugieren, y solo "Sentir mal". ¡¡Gracias!! – horseshoe7

+1

great Answer of all time .. :) –

Cuestiones relacionadas