W niektórych wcześniejszych wersjach iOS (takich jak iOS 9, 10) scrollViewDidEndDecelerating
nie zostanie wyzwolony, jeśli scrollView zostanie nagle zatrzymany przez dotknięcie.
Ale w obecnej wersji (iOS 13) scrollViewDidEndDecelerating
na pewno zostanie uruchomiony (o ile wiem).
Jeśli więc Twoja aplikacja była skierowana również do wcześniejszych wersji, możesz potrzebować obejścia takiego jak to, o którym wspomina Ashley Smart, lub możesz użyć następującego.
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
}
Wyjaśnienie
UIScrollView zostanie zatrzymany na trzy sposoby:
- szybko przewijany i zatrzymywany samoczynnie
- szybko przewijany i zatrzymywany przez dotknięcie palcem (jak hamulec awaryjny)
- powoli przewijany i zatrzymywany
Pierwszą można wykryć scrollViewDidEndDecelerating
i innymi podobnymi metodami, podczas gdy dwie pozostałe nie.
Na szczęście UIScrollView
ma trzy stany, których możemy użyć do ich identyfikacji, które są używane w dwóch wierszach opatrzonych komentarzem „// 1” i „// 2”.