2012-01-03 16 views
11

Tengo un UIScrollView con paginación habilitada, y he agregado mi propio UIPanGestureRegonizer a él. Bajo ciertas circunstancias, mi controlador de vista configurará scrollview.scrollEnabled = NO, y luego agregará el reconocedor de gestos pan (no estoy usando el reconocedor propio de scrollview).Desplazamiento continuo entre UIPanGestureRecognizer y reactivado UIScrollView

Por lo tanto, el desplazamiento está desactivado, pero estoy esperando los toques de usuario de mi reconocedor de gestos. Cuando lo reconoce, llama a su acción en la que vuelvo a habilitar el desplazamiento.

El problema es que, mientras el usuario todavía tiene un dedo hacia abajo, mi scrollview no rastrea con el dedo. No comienza a desplazarse hasta que el dedo se levanta y luego se vuelve a arrastrar. Así que mi reconocedor de gestos está tragando todos los toques y no reenvía ninguno a la vista de desplazamiento.

He intentado alternar panGestureRecognizer.cancelsTouchesInView = NO; pero no parece tener ningún efecto (actualmente estoy eliminando este reconocedor tan pronto como vuelva a habilitar el desplazamiento, pero si lo hago o no no resuelve mi problema) . También he investigado las propiedades delays... de UIGestureRecognizer, pero tampoco parecen estar ayudando.

¿Alguna idea? ¿Cómo puedo hacer que estos eventos continúen reenviando a mi vista de desplazamiento?

+0

¿Usted intentó regresar '' YES' en gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer: 'método? – Hejazi

+0

@Hejazi Sí, también he implementado ese método de delegado (y configuré mi delegado) pero no se ejecuta mientras el dedo todavía está abajo (solo una vez que he levantado y vuelto a colocar el dedo, se llama este método delegado) . – jbrennan

Respuesta

5

La respuesta es un poco más fácil si solo está orientada a iOS 5 y superior, porque en ese caso realmente debería volver a utilizar la propiedad UIScrollView panGestureRecognizer.

En cualquier caso, el paso clave es NO reutilizar scrollEnabled, sino en su lugar la subclase UIScrollView, crear su propia propiedad para administrar este estado y anular setContentOffset :.

- (void) setContentOffset:(CGPoint)contentOffset 
    { 
     if(self.programaticScrollEnabled) 
      [super setContentOffset:contentOffset]; 
    } 

He aquí una posible iOS 4 Solución:

  1. Subclase UIScrollView (o subclase de otra subclase de UIScrollView, dependiendo de sus necesidades).
  2. Anula todos los inicializadores para garantizar que se invoque su código de configuración.
  3. Declare la propiedad BOOL y anule setContentOffset: como se describió anteriormente.
  4. En su código de configuración, configure una UIPanGestureRecognizer y establecer su variable de estado para permitir el desplazamiento programática (se supone que es el estado por defecto que desee):

    panRecognizer = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)] autorelease]; 
    //These properties may change according to your needs 
    panRecognizer.cancelsTouchesInView = NO; 
    panRecognizer.delaysTouchesBegan = NO; 
    panRecognizer.delaysTouchesEnded = NO; 
    [self addGestureRecognizer:panRecognizer]; 
    panRecognizer.delegate = self; 
    
    self.programaticScrollEnabled = YES; 
    
  5. Administrar los gestos pueden ocurrir simultáneamente. En mi caso:

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
    { 
        return YES; 
    } 
    
  6. Turn desplazamiento programática de nuevo siempre que lo necesite. Por ejemplo:

    - (void)handleGesture:(UIPanGestureRecognizer *)gestureRecognizer 
    { 
        self.programaticScrollEnabled = YES; 
    } 
    
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
    { 
        self.programaticScrollEnabled = YES; 
        return YES; 
    } 
    
Cuestiones relacionadas