UIScrollViewDelegate tiene dos métodos de delegado scrollViewDidScroll:
y scrollViewDidEndScrollingAnimation:
ninguno de estos le indica cuándo se ha completado el desplazamiento. scrollViewDidScroll
solo le notifica que la vista de desplazamiento se desplazó, no que ha terminado de desplazarse.
El otro método scrollViewDidEndScrollingAnimation
solo parece activarse si mueve la vista de desplazamiento mediante programación, no si el usuario se desplaza.
¿Alguien sabe de esquema para detectar cuando una vista de desplazamiento ha completado el desplazamiento?
ios
iphone
uiscrollview
Michael Gaylord
fuente
fuente
Respuestas:
fuente
Las 320 implementaciones son mucho mejores: aquí hay un parche para obtener un inicio / final consistente del desplazamiento.
fuente
Creo que scrollViewDidEndDecelerating es el que quieres. Su método opcional UIScrollViewDelegates:
Le dice al delegado que la vista de desplazamiento ha finalizado la desaceleración del movimiento de desplazamiento.
Documentación UIScrollViewDelegate
fuente
Para todos los pergaminos relacionados con las interacciones de arrastre, esto será suficiente:
Ahora, si su desplazamiento se debe a un setContentOffset / scrollRectVisible programático (con
animated
= YES o obviamente sabe cuándo finaliza el desplazamiento):Si su desplazamiento se debe a algo más (como abrir o cerrar el teclado), parece que tendrá que detectar el evento con un truco porque
scrollViewDidEndScrollingAnimation
tampoco es útil.El caso de una vista de desplazamiento PAGINADA :
Porque, supongo, Apple aplica una curva de aceleración,
scrollViewDidEndDecelerating
recibe una llamada para cada arrastre, por lo que no hay necesidad de usarscrollViewDidEndDragging
en este caso.fuente
scrollViewDidEndDecelerating
no se llamaráEsto se ha descrito en algunas de las otras respuestas, pero aquí está (en código) cómo combinar
scrollViewDidEndDecelerating
yscrollViewDidEndDragging:willDecelerate
realizar alguna operación cuando finalice el desplazamiento:fuente
Acabo de encontrar esta pregunta, que es más o menos lo mismo que pregunté: ¿Cómo saber exactamente cuándo se ha detenido el desplazamiento de UIScrollView?
Aunque didEndDecelerating funciona al desplazarse, el desplazamiento panorámico con liberación estacionaria no se registra.
Finalmente encontré una solución. didEndDragging tiene un parámetro WillDecelerate, que es falso en la situación de liberación estacionaria.
Al verificar! Desacelerar en DidEndDragging, combinado con didEndDecelerating, obtienes ambas situaciones que son el final del desplazamiento.
fuente
Si te gusta Rx, puedes extender UIScrollView así:
lo que te permitirá hacer lo siguiente:
Esto tendrá en cuenta tanto el arrastre como la desaceleración.
fuente
fuente
He intentado la respuesta de Ashley Smart y funcionó de maravilla. Aquí hay otra idea, con usar solo scrollViewDidScroll
Solo tenía dos páginas, así que funcionó para mí. Sin embargo, si tiene más de una página, podría ser problemático (podría verificar si el desplazamiento actual es un múltiplo del ancho, pero entonces no sabría si el usuario se detuvo en la segunda página o está en camino a la tercera o más)
fuente
Versión rápida de la respuesta aceptada:
fuente
Si alguien lo necesita, aquí está la respuesta de Ashley Smart en Swift
fuente
Solución recién desarrollada para detectar cuando el desplazamiento finaliza en toda la aplicación: https://gist.github.com/k06a/731654e3168277fb1fd0e64abc7d899e
Se basa en la idea de seguir los cambios de los modos runloop. Y realice bloques al menos después de 0.2 segundos después del desplazamiento.
Esta es la idea central para el seguimiento de los cambios en los modos runloop iOS10 +:
Y solución para objetivos de baja implementación como iOS2 +:
fuente
Para recapitular (y para novatos). No es tan doloroso. Simplemente agregue el protocolo, luego agregue las funciones que necesita para la detección.
En la vista (clase) que contiene UIScrolView, agregue el protocolo y luego agregue las funciones desde aquí a su vista (clase).
fuente
Tuve un caso de tocar y arrastrar acciones y descubrí que arrastrar llamaba scrollViewDidEndDecelerating
Y el cambio se compensó manualmente con el código ([_scrollView setContentOffset: contentOffset animated: YES];) estaba llamando a scrollViewDidEndScrollingAnimation.
fuente
Una alternativa sería usar
scrollViewWillEndDragging:withVelocity:targetContentOffset
cual se llama cada vez que el usuario levanta el dedo y contiene el desplazamiento del contenido objetivo donde se detendrá el desplazamiento. El uso de este desplazamiento de contenidoscrollViewDidScroll:
identifica correctamente cuándo la vista de desplazamiento ha dejado de desplazarse.fuente
UIScrollview tiene un método delegado
Agregue las siguientes líneas de código en el método delegado
fuente
Hay un método
UIScrollViewDelegate
que puede usarse para detectar (o mejor decir 'predecir') cuando el desplazamiento realmente ha terminado:de los
UIScrollViewDelegate
cuales se pueden usar para detectar (o mejor decir 'predecir') cuando el desplazamiento realmente ha terminado.En mi caso, lo usé con desplazamiento horizontal de la siguiente manera (en Swift 3 ):
fuente
Usa la lógica Ashley Smart y se está convirtiendo en Swift 4.0 y superior.
La lógica anterior resuelve problemas como cuando el usuario se desplaza fuera de la vista de tabla. Sin la lógica, cuando salga de la vista de tabla,
didEnd
se llamará pero no ejecutará nada. Actualmente usándolo en el año 2020.fuente
En algunas versiones anteriores de iOS (como iOS 9, 10),
scrollViewDidEndDecelerating
no se activará si el scrollView se detiene repentinamente al tocar.Pero en la versión actual (iOS 13),
scrollViewDidEndDecelerating
se activará con seguridad (que yo sepa).Entonces, si su aplicación también apuntó a versiones anteriores, es posible que necesite una solución alternativa como la mencionada por Ashley Smart, o puede la siguiente.
Explicación
UIScrollView se detendrá de tres maneras:
- se desplaza y se detiene rápidamente por sí mismo
- se desplaza y se detiene rápidamente con el toque de un dedo (como el freno de emergencia)
- se desplaza y se detiene lentamente
El primero se puede detectar mediante
scrollViewDidEndDecelerating
y otros métodos similares, mientras que los otros dos no.Afortunadamente,
UIScrollView
tiene tres estados que podemos usar para identificarlos, que se usa en las dos líneas comentadas por "// 1" y "// 2".fuente