Pregunta

Estoy intentando implementar un UIScrollView donde la panorámica horizontal se desplaza a través de las imágenes en la vista de desplazamiento, pero la panorámica vertical realiza otra acción que tengo.En este momento tengo un UIScrollView que está paginado con el desplazamiento vertical deshabilitado que funciona bien para desplazarse por las imágenes, pero me estoy volviendo loco tratando de encontrar una manera de interceptar los desplazamientos verticales y llamar a mi propio método en lugar de que los desplazamientos verticales simplemente sean devorados por la vista de desplazamiento.pude hacer

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

Lo que me da control total sobre la panorámica en mi handlePanGesture:método, pero esto no es particularmente útil porque entonces siento que esencialmente voy a reescribir toda la lógica de desplazamiento que estoy tratando de evitar.Cualquier ayuda u orientación sobre cómo lograr esto será muy apreciada.

¡Gracias!

¿Fue útil?

Solución

Creo que esto será difícil si quieres usar un gesto de PAN debido al uso de la vista de desplazamiento de esos gestos.Sin embargo, si puede usar un golpe, 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 no necesita deshabilitar el reconocedor de gesto de la Vista de Scroll (en mi prueba, la vista de desplazamiento fue lo suficientemente alta y el contenido lo suficientemente alto como para que no hayaDesplazamiento vertical: no sé si esto es necesario o no).

Otros consejos

A partir de iOS 5, UIScrollView expone su UIPanGestureRecognizer.Establece tus deslizamientos personalizados delegate a self y convierta el gestoRecognizer en una propiedad o ivar, y haga que su clase se ajuste al <UIGestureRecognizerDelegate> protocolo.Luego, implementar UIGestureRecognizerDelegate's – gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: al igual que:

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

Añadido un UIPanGestureRecognizer y luego setupgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: como este:

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

También agregué 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;
}

para usar solo self.panGesture cuando se asoma 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top