2012-10-02 20 views
8

Estoy intentando implementar un UIScrollView donde el desplazamiento horizontal se desplaza por las imágenes en la vista de desplazamiento, pero el desplazamiento vertical realiza otra acción que tengo. Ahora tengo un UIScrollView que está paginado con desplazamiento vertical deshabilitado que funciona bien para desplazarse por las imágenes, pero me estoy volviendo loco tratando de encontrar una manera de interceptar las cacerolas verticales y llamar a mi propio método en lugar de las cacerolas verticales que son devoradas por la vista de desplazamiento Yo era capaz de hacerDesplazamiento horizontal UIScrollView con gesto de desplazamiento vertical

UIPanGestureRecognizer *panUp = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)]; 
[self.scrollView addGestureRecognizer:panUp]; 
[scrollView.panGestureRecognizer setEnabled:NO]; 

Lo que me da un control total sobre el encuadramiento en mi handlePanGesture: método, pero esto no es particularmente útil porque entonces me siento como si estuviera en esencia va a ser volver a escribir toda la lógica de desplazamiento de los cuales Estoy tratando de evitar Cualquier ayuda u orientación sobre cómo lograr esto sería muy apreciada.

Gracias!

+0

Qué es lo que estamos tratando de hacer con su bandeja vertical? ¿Implica el desplazamiento o no? – rdelmar

+0

No implica desplazamiento. Tengo una subvista que quiero animar en la misma vista padre de la vista de desplazamiento (la vista de desplazamiento solo ocupa una parte de la vista de su padre) – lramirez135

+0

Entonces no entiendo su afirmación: "Siento que esencialmente voy a estar reescribiendo toda la lógica de desplazamiento ". ¿Pan horizontal funciona correctamente? ¿El panUp todavía está siendo interceptado por scrollView? – rdelmar

Respuesta

4

Creo que esto será difícil si desea utilizar un gesto de panorámica debido al uso de la vista de desplazamiento de esos gestos. Sin embargo, si puede usar un deslizamiento, es fácil de implementar.

UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)]; 
    swipe.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp; 
    [self.scrollView addGestureRecognizer:swipe]; 

He probado esto, y funcionó bien para llamar al manejador, y que no es necesario desactivar reconocedor gesto bandeja de la vista de desplazamiento (en mi prueba, la vista de desplazamiento era lo suficientemente alto y el contenido lo suficientemente corto que no había desplazamiento vertical, no sé si esto es necesario o no).

+1

Oye, muchas gracias por tu ayuda.Esto funcionó perfectamente y me salvó de volverme aún más loco intentando que la sartén funcione. Estaba evitando usar el deslizamiento porque pensé que no respondería a la lentitud de la pantalla, pero en realidad funcionó bien incluso con los golpes lentos. Gracias de nuevo. – lramirez135

+0

inútil. ¿Has intentado deslizar el gesto por ti mismo? No es lo suficientemente personalizable para trabajar con él. –

10

A partir de iOS 5, UIScrollViewexposes its UIPanGestureRecognizer. Establezca el deslizamiento personalizado delegate en self y convierta el gestureRecognizer en una propiedad o ivar, y haga que su clase se ajuste al protocolo <UIGestureRecognizerDelegate>. A continuación, aplicar UIGestureRecognizerDelegate 's – gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: así:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    if ([gestureRecognizer isEqual:self.swipe] && [otherGestureRecognizer isEqual:self.scrollView.panGestureRecognizer]) 
    { 
     return NO; 
    } 
    return YES; // the default for this method 
} 
+0

Me gusta esta respuesta porque pone más control en mis manos con un gesto panorámico en lugar de un simple deslizamiento. Tuve un problema con mi uitableview trabajando simultáneamente con un gesto panorámico de lado a lado. Esto lo resolvió. – Bastek

+0

¡No funciona! 'otherGestureRecognizer' es' UIScrollViewDelayedTouchesBeganGestureRecognizer' y, por supuesto, no es igual a 'self.scrollView.panGestureRecognizer' –

+0

Se llamará a este método para cada reconocedor de gestos que pueda necesitar reconocer simultáneamente con cualquier reconocedor de gestos cuyo objeto sea el delegado. –

9

He añadido una configuración UIPanGestureRecognizer continuación gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: así:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    if ([gestureRecognizer isEqual:self.panGesture] && [otherGestureRecognizer isEqual:self.collectionView.panGestureRecognizer]){ 
     return YES; 
    } 
    return NO; 
} 

También he añadido un cheque en gestureRecognizerShouldBegin:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 
    if ([gestureRecognizer isEqual:self.panGesture]) { 
     if (gestureRecognizer.numberOfTouches > 0) { 
      CGPoint point = [gestureRecognizer locationOfTouch:0 inView:gestureRecognizer.view]; 
      CGFloat distX = abs(self.collectionView.lastTouchPos.x - point.x); 
      CGFloat distY = abs(self.collectionView.lastTouchPos.y - point.y); 
      if (distX > distY) { 
       return NO; 
      } 
     } else { 
      return NO; 
     } 
    } 
    return YES; 
} 

sólo use self.panGesture al hacer un barrido hacia arriba o hacia abajo.

actualización

https://stackoverflow.com/a/8603839/667834 parece tener un mejor método para gestureRecognizerShouldBegin

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 
    if ([gestureRecognizer isEqual:self.panGesture]) { 
     if (gestureRecognizer.numberOfTouches > 0) { 
      CGPoint translation = [self.panGesture velocityInView:self.collectionView]; 
      return fabs(translation.y) > fabs(translation.x); 
     } else { 
      return NO; 
     } 
    } 
    return YES; 
} 
+0

gracias por la solución –

+1

Funcionó para mí, excepto que necesitaba fabs (translation.y) SeanR

+1

Esto debería marcarse como la respuesta –

Cuestiones relacionadas