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.
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
if !scrollView.isTracking, !scrollView.isDragging, !scrollView.isDecelerating { // 1
scrollViewDidEndScrolling(scrollView)
}
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if !decelerate, scrollView.isTracking, !scrollView.isDragging, !scrollView.isDecelerating { // 2
scrollViewDidEndScrolling(scrollView)
}
}
func scrollViewDidEndScrolling(_ scrollView: UIScrollView) {
// Do something here
}
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".