objective-c ios uiscrollview uipangesturerecognizer

objective c - Desplazamiento continuo entre UIPanGestureRecognizer y reactivado UIScrollView



objective-c ios (1)

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

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

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

Aquí hay una posible solución de iOS 4+:

  1. Subclase UIScrollView (o subclase de otra subclase de UIScrollView, según sus necesidades).
  2. Anule todos los inicializadores para asegurarse de 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 un UIPanGestureRecognizer y establezca su variable de estado para permitir el desplazamiento programatico (suponiendo que ese es el estado predeterminado que desea):

    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. Administre qué gestos pueden ocurrir simultáneamente. En mi caso:

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

  6. Vuelva a activar el desplazamiento programático donde lo necesite. Por ejemplo:

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

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

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 se levanta el dedo y luego se lo 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 UIGestureRecognizer los delays... propiedades de UIGestureRecognizer pero tampoco parecen estar ayudando.

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