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 este método a veces no recibe ninguna llamada cuando me muevo. ¿Qué piensas?
iphone
ios
cocoa-touch
uiscrollview
Alex1987
fuente
fuente
Respuestas:
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 desliza el dedo 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 iré brevemente hacia la izquierda.
Para determinar la dirección, deberá usar el
UIScrollView scrollViewDidScroll
delegado. En esta muestra, creé una variable llamadalastContentOffset
que utilizo 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: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:
fuente
lastContentOffset = scrollView.contentOffset.x;
lastContentOffset
tipo. Con respecto a la propiedad frente a las variables estáticas: cualquier solución es una buena opción. No tengo preferencia real. Es un buen punto.En ese caso, en iOS 5 y superior, use
UIScrollViewDelegate
para determinar la dirección del gesto panorámico del usuario:fuente
Usar
scrollViewDidScroll:
es una buena manera de encontrar la dirección actual.Si desea conocer la dirección después de que el usuario haya terminado de desplazarse, use lo siguiente:
fuente
No es necesario agregar una variable adicional para realizar un seguimiento de esto. Sólo tiene que utilizar la
UIScrollView
'spanGestureRecognizer
propiedad como esta. Desafortunadamente, esto funciona solo si la velocidad no es 0:Puede usar una combinación de componentes x e y para detectar arriba, abajo, izquierda y derecha.
fuente
La solución
fuente
velocityInView
lugar detranslationInView
. Esto resuelve el problema que surge al cambiar de dirección en el mismo movimiento.Swift 4:
Para el desplazamiento horizontal, simplemente puede hacer:
Para el cambio de desplazamiento vertical
.x
con.y
fuente
En iOS8 Swift utilicé este método:
Tengo una vista dinámica que cambia las ubicaciones a medida que el usuario se desplaza para que la vista parezca que se quedó en el mismo lugar en la pantalla. También estoy rastreando cuando el usuario sube o baja.
Aquí también hay una forma alternativa:
fuente
crollViewDidEndDecelerating
derecha?Esto es lo que funcionó para mí (en Objective-C):
fuente
fuente
Alternativamente, es posible observar la ruta clave "contentOffset". Esto es útil cuando no es posible establecer / cambiar el delegado de la vista de desplazamiento.
Después de agregar el observador, ahora podría:
Recuerde quitar el observador cuando sea necesario. por ejemplo, puede agregar el observador en viewWillAppear y eliminarlo en viewWillDisappear
fuente
En rápido:
También puedes hacerlo en scrollViewDidScroll.
fuente
Aquí está mi solución para el comportamiento como en la respuesta @followben, pero sin pérdida con inicio lento (cuando dy es 0)
fuente
Revisé algunas de las respuestas y desarrollé la respuesta AnswerBot envolviendo todo en una sola gota en la categoría UIScrollView. El "lastContentOffset" se guarda dentro de uiscrollview en su lugar y luego es solo cuestión de llamar:
Código fuente en https://github.com/tehjord/UIScrollViewScrollingDirection
fuente
Prefiero hacer un filtrado, basado en la respuesta de @ memmons
En el objetivo-C:
Cuando se prueba en
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
:self.lastContentOffset
cambia muy rápido, la brecha de valor es casi 0.5f.No es necesario.
Y ocasionalmente, cuando se maneja en condiciones precisas, su orientación puede perderse. (las declaraciones de implementación se omiten a veces)
como :
En Swift 4:
fuente
Cuando la paginación está activada, puede usar este código.
fuente
Códigos se explica, supongo. CGFloat diferencia1 y diferencia2 declaradas en la misma interfaz privada de clase. Bueno si contentSize se mantiene igual.
fuente
Ok, para mí esta implementación funciona realmente bien:
Entonces, esto activará textView para descartar después de que finalice el arrastre
fuente
Use este método delegado de scrollview.
Si la coordenada de velocidad y es + ve, la vista de desplazamiento se desplaza hacia abajo y si es -ve, la vista de desplazamiento se desplaza hacia arriba. De manera similar, el desplazamiento hacia la izquierda y hacia la derecha se puede detectar usando la coordenada x.
fuente
Corto y fácil sería, solo verifique el valor de la velocidad, si es mayor que cero, entonces se desplaza hacia la izquierda o hacia la derecha:
fuente
Si trabaja con UIScrollView y UIPageControl, este método también cambiará la vista de página de PageControl.
Gracias el código Swift de @Esq.
fuente
Swift 2.2 Solución simple que rastrea direcciones simples y múltiples sin ninguna pérdida.
fuente
En todas las respuestas superiores, dos formas principales de resolver el problema es usar
panGestureRecognizer
ocontentOffset
. Ambos métodos tienen sus desventajas y ventajas.Método 1: panGestureRecognizer
Cuando usa
panGestureRecognizer
como lo que sugirió @followben, si no desea desplazar programáticamente su vista de desplazamiento, funciona correctamente.Contras
Pero si mueve la vista de desplazamiento con el siguiente código, el código superior no puede reconocerlo:
Método 2: contentOffset
Contras
Si desea cambiar contentOffset mediante programación, durante el desplazamiento (como cuando desea crear un desplazamiento infinito), este método genera problemas, porque puede cambiar
contentOffset
durante el cambio de las vistas de contenido y, en este momento, el salto de código superior se desplaza hacia la derecha o izquierda.fuente
Respuesta de Mos6y https://medium.com/@Mos6yCanSwift/swift-ios-determine-scroll-direction-d48a2327a004
fuente