Em algumas versões anteriores do iOS (como iOS 9, 10), scrollViewDidEndDecelerating
não será acionado se o scrollView for subitamente interrompido ao tocar.
Mas na versão atual (iOS 13), scrollViewDidEndDecelerating
será acionado com certeza (tanto quanto eu sei).
Portanto, se o seu aplicativo também segmentou versões anteriores, você pode precisar de uma solução alternativa, como a mencionada por Ashley Smart, ou a seguinte.
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
}
Explicação
O UIScrollView será parado de três maneiras:
- rolou e parou
rapidamente sozinho - rolou e parou rapidamente com o toque do dedo (como freio de emergência)
- rolou e parou lentamente
O primeiro pode ser detectado por scrollViewDidEndDecelerating
e outros métodos similares, enquanto os outros dois não.
Felizmente, UIScrollView
possui três status que podemos usar para identificá-los, que é usado nas duas linhas comentadas por "// 1" e "// 2".