На некоторых более ранних версиях iOS (например, iOS 9, 10) scrollViewDidEndDecelerating
не будет запускаться, если scrollView внезапно останавливается при касании.
Но в текущей версии (iOS 13), scrollViewDidEndDecelerating
будет срабатывать точно (насколько я знаю).
Поэтому, если ваше приложение нацелено и на более ранние версии, вам может понадобиться обходной путь, подобный тому, который упоминал Эшли Смарт, или следующий.
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
}
объяснение
UIScrollView будет остановлен тремя способами:
- быстро прокручивается и останавливается сам по себе
- быстро прокручивается и останавливается прикосновением пальца (например, аварийный тормоз)
- медленно прокручивается и останавливается
Первый может быть обнаружен scrollViewDidEndDecelerating
и другими подобными методами, а два других - нет.
К счастью, у нас UIScrollView
есть три состояния, которые мы можем использовать для их идентификации, что используется в двух строках с комментариями «// 1» и «// 2».