¿Encontrar la dirección de desplazamiento en un UIScrollView?
Tengo un UIScrollView
solo desplazamiento horizontal permitido y me gustaría saber en qué dirección (izquierda, derecha) se desplaza el usuario. Lo que hice fue subclasificar UIScrollView
y anular el touchesMoved
mé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?
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 scrollViewDidScroll
delegado. En este ejemplo, creé una variable denominada lastContentOffset
que 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,
};
...Me gustaría saber en qué dirección (izquierda, derecha) se desplaza el usuario.
En ese caso, en iOS 5 y superior, utilice UIScrollViewDelegate
para 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
}
}
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
}
}
No es necesario agregar una variable adicional para realizar un seguimiento de esto. Simplemente use la UIScrollView
propiedad panGestureRecognizer
de 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.