Sur certaines versions antérieures d'iOS (comme iOS 9, 10), scrollViewDidEndDecelerating
ne sera pas déclenché si le scrollView est soudainement arrêté en touchant.
Mais dans la version actuelle (iOS 13), scrollViewDidEndDecelerating
sera déclenché à coup sûr (pour autant que je sache).
Donc, si votre application ciblait également des versions antérieures, vous pourriez avoir besoin d'une solution de contournement comme celle mentionnée par Ashley Smart, ou vous pouvez la suivante.
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
}
Explication
UIScrollView sera arrêté de trois manières:
- défilement rapide et arrêté par lui
- même - défilement rapide et arrêté par le toucher du doigt (comme le frein d'urgence)
- défilement lent et arrêté
Le premier peut être détecté par scrollViewDidEndDecelerating
et d'autres méthodes similaires tandis que les deux autres ne le peuvent pas.
Heureusement, UIScrollView
a trois statuts que nous pouvons utiliser pour les identifier, qui est utilisé dans les deux lignes commentées par "// 1" et "// 2".