¿Encontrar la dirección de desplazamiento en un UIScrollView?

Resuelto Alex1987 asked hace 54 años • 24 respuestas

Tengo un UIScrollViewsolo desplazamiento horizontal permitido y me gustaría saber en qué dirección (izquierda, derecha) se desplaza el usuario. Lo que hice fue subclasificar UIScrollViewy anular el touchesMovedmétodo:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];

    UITouch *touch = [touches anyObject];
    float now = [touch locationInView:self].x;
    float before = [touch previousLocationInView:self].x;
    NSLog(@"%f %f", before, now);
    if (now > before){
        right = NO;
        NSLog(@"LEFT");
    }
    else{
        right = YES;
        NSLog(@"RIGHT");

    }

}

Pero a veces este método no se llama en absoluto cuando me muevo. ¿Qué opinas?

Alex1987 avatar Jan 01 '70 08:01 Alex1987
Aceptado

Determinar la dirección es bastante sencillo, pero tenga en cuenta que la dirección puede cambiar varias veces en el transcurso de un gesto. Por ejemplo, si tiene una vista de desplazamiento con la paginación activada y el usuario se desliza para ir a la página siguiente, la dirección inicial podría ser hacia la derecha, pero si tiene activado el rebote, brevemente no irá en ninguna dirección y luego vaya brevemente hacia la izquierda.

Para determinar la dirección, necesitará utilizar el UIScrollView scrollViewDidScrolldelegado. En este ejemplo, creé una variable denominada lastContentOffsetque uso para comparar el desplazamiento del contenido actual con el anterior. Si es mayor, entonces scrollView se desplaza hacia la derecha. Si es menor, entonces scrollView se desplaza hacia la izquierda:

// somewhere in the private class extension
@property (nonatomic, assign) CGFloat lastContentOffset;

// somewhere in the class implementation
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    ScrollDirection scrollDirection;

    if (self.lastContentOffset > scrollView.contentOffset.x) {
        scrollDirection = ScrollDirectionRight;
    } else if (self.lastContentOffset < scrollView.contentOffset.x) {
        scrollDirection = ScrollDirectionLeft;
    }

    self.lastContentOffset = scrollView.contentOffset.x;

    // do whatever you need to with scrollDirection here.    
}

Estoy usando la siguiente enumeración para definir la dirección. Establecer el primer valor en ScrollDirectionNone tiene el beneficio adicional de hacer que esa dirección sea la predeterminada al inicializar variables:

typedef NS_ENUM(NSInteger, ScrollDirection) {
    ScrollDirectionNone,
    ScrollDirectionRight,
    ScrollDirectionLeft,
    ScrollDirectionUp,
    ScrollDirectionDown,
    ScrollDirectionCrazy,
};
memmons avatar Nov 01 '2010 21:11 memmons

...Me gustaría saber en qué dirección (izquierda, derecha) se desplaza el usuario.

En ese caso, en iOS 5 y superior, utilice UIScrollViewDelegatepara determinar la dirección del gesto panorámico del usuario:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{ 
    if ([scrollView.panGestureRecognizer translationInView:scrollView.superview].x > 0) {
        // handle dragging to the right
    } else {
        // handle dragging to the left
    }
}
followben avatar Feb 16 '2014 03:02 followben

Usar scrollViewDidScroll:es una buena manera de encontrar la dirección actual.

Si desea saber la dirección después de que el usuario haya terminado de desplazarse, utilice lo siguiente:

@property (nonatomic) CGFloat lastContentOffset;

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {

    self.lastContentOffset = scrollView.contentOffset.x;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    if (self.lastContentOffset > scrollView.contentOffset.x) {
        // moved right if last content offset is greater then current offset
    } else if (self.lastContentOffset < scrollView.contentOffset.x) {
        // moved left if last content offset is less that current offset
    } else {
        // didn't move
    }
}
Justin Tanner avatar Feb 08 '2012 21:02 Justin Tanner

No es necesario agregar una variable adicional para realizar un seguimiento de esto. Simplemente use la UIScrollViewpropiedad panGestureRecognizerde esta manera. Desafortunadamente, esto sólo funciona si la velocidad no es 0:

CGFloat yVelocity = [scrollView.panGestureRecognizer velocityInView:scrollView].y;
if (yVelocity < 0) {
    NSLog(@"Up");
} else if (yVelocity > 0) {
    NSLog(@"Down");
} else {
    NSLog(@"Can't determine direction as velocity is 0");
}

Puede utilizar una combinación de componentes xey para detectar arriba, abajo, izquierda y derecha.

rounak avatar Oct 04 '2014 10:10 rounak