UIScrollViewDelegate имеет два метода делегата scrollViewDidScroll:
и , scrollViewDidEndScrollingAnimation:
но ни один из них не скажет вам , когда листание завершена. scrollViewDidScroll
только уведомляет вас о том, что представление прокрутки прокручивается, но не завершило прокрутку.
Другой метод scrollViewDidEndScrollingAnimation
срабатывает только в том случае, если вы программно перемещаете представление прокрутки, а не при прокрутке пользователем.
Кто-нибудь знает схему обнаружения прокрутки после завершения просмотра?
ios
iphone
uiscrollview
Майкл Гейлорд
источник
источник
Ответы:
источник
Реализации 320 намного лучше - вот патч, чтобы получить последовательные начало / конец прокрутки.
источник
Я думаю, что scrollViewDidEndDecelerating - это то, что вам нужно. Его UIScrollViewDelegates необязательный метод:
Сообщает делегату, что представление прокрутки прекратило замедление движения прокрутки.
UIScrollViewDelegate документация
источник
Для всех свитков, связанных с перетаскиванием взаимодействий, этого будет достаточно:
Теперь, если ваша прокрутка вызвана программным setContentOffset / scrollRectVisible (с
animated
= YES или вы, очевидно, знаете, когда прокрутка закончена):Если ваша прокрутка вызвана чем-то другим (например, открытием клавиатуры или закрытием клавиатуры), похоже, что вам придется обнаруживать событие с помощью хака, потому что
scrollViewDidEndScrollingAnimation
это также бесполезно.Случай с прокруткой PAGINATED :
Потому что, я думаю, Apple применяет кривую ускорения,
scrollViewDidEndDecelerating
вызывается для каждого перетаскивания, поэтомуscrollViewDidEndDragging
в этом случае нет необходимости использовать .источник
scrollViewDidEndDecelerating
она не будет вызванаЭто было описано в некоторых других ответах, но вот (в коде), как объединить
scrollViewDidEndDecelerating
иscrollViewDidEndDragging:willDecelerate
выполнить некоторую операцию после завершения прокрутки:источник
Я только что нашел этот вопрос, который в значительной степени совпадает с тем, который я задал: Как точно узнать, когда прокрутка UIScrollView прекратилась?
Хотя didEndDecelerating работает при прокрутке, панорамирование со стационарным выпуском не регистрируется.
В конце концов я нашел решение. У didEndDragging есть параметр WillDecelerate, который является ложным в ситуации стационарного выпуска.
Проверяя на! Замедление в DidEndDragging, в сочетании с didEndDecelerating, вы получаете обе ситуации, которые являются концом прокрутки.
источник
Если вы в Rx, вы можете расширить UIScrollView следующим образом:
что позволит вам просто сделать так:
Это будет учитывать как перетаскивание и замедление.
источник
источник
Я попробовал ответ Эшли Смарт, и он сработал как шарм. Вот еще одна идея, с использованием только scrollViewDidScroll
У меня просто было две страницы, так что у меня получилось. Однако, если у вас более одной страницы, это может быть проблематично (вы можете проверить, кратно ли текущее смещение ширине, но тогда вы не узнаете, остановился ли пользователь на 2-й странице или находится на пути к 3-й или Больше)
источник
Быстрая версия принятого ответа:
источник
Если кто-то нуждается, вот ответ Эшли Смарт в Swift
источник
Только что разработанное решение для обнаружения при прокрутке завершено для всего приложения: https://gist.github.com/k06a/731654e3168277fb1fd0e64abc7d899e
Он основан на идее отслеживания изменений режимов runloop. И выполнять блоки по крайней мере через 0,2 секунды после прокрутки.
Это основная идея для отслеживания изменений режимов runloop iOS10 +:
И решение для целей с низким уровнем развертывания, таких как iOS2 +:
источник
Подведем итоги (и для новичков). Это не так больно. Просто добавьте протокол, затем добавьте функции, необходимые для обнаружения.
В представлении (классе), которое содержит UIScrolView, добавьте протокол, а затем добавьте любые функции отсюда в ваше представление (класс).
источник
У меня был случай касания и перетаскивания действий, и я обнаружил, что перетаскивание вызывало scrollViewDidEndDecelerating
И смещение изменения вручную с кодом ([_scrollView setContentOffset: contentOffset animated: YES];) вызывало scrollViewDidEndScrollingAnimation.
источник
Альтернативой может быть использование,
scrollViewWillEndDragging:withVelocity:targetContentOffset
которое вызывается всякий раз, когда пользователь поднимает палец, и содержит смещение целевого содержимого, в котором прокрутка останавливается. Использование этого смещения содержимогоscrollViewDidScroll:
правильно определяет, когда представление прокрутки прекратило прокрутку.источник
UIScrollview имеет метод делегата
Добавьте следующие строки кода в методе делегата
источник
Существует метод, с помощью
UIScrollViewDelegate
которого можно определить (или лучше сказать «предсказать»), когда прокрутка действительно завершена:из
UIScrollViewDelegate
которых можно использовать для определения (или лучше сказать «предсказать»), когда прокрутка действительно завершена.В моем случае я использовал его с горизонтальной прокруткой следующим образом (в Swift 3 ):
источник
Использует логику Эшли Смарт и конвертируется в Swift 4.0 и выше.
Приведенная выше логика решает проблемы, например, когда пользователь прокручивает таблицу. Без логики, когда вы прокручиваете таблицу, вызывается,
didEnd
но она ничего не будет выполнять. В настоящее время использую его в 2020 году.источник
На некоторых более ранних версиях iOS (например, iOS 9, 10)
scrollViewDidEndDecelerating
не будет запускаться, если scrollView внезапно останавливается при касании.Но в текущей версии (iOS 13),
scrollViewDidEndDecelerating
будет срабатывать точно (насколько я знаю).Поэтому, если ваше приложение нацелено и на более ранние версии, вам может понадобиться обходной путь, подобный тому, который упоминал Эшли Смарт, или следующий.
объяснение
UIScrollView будет остановлен тремя способами:
- быстро прокручивается и останавливается сам по себе
- быстро прокручивается и останавливается прикосновением пальца (например, аварийный тормоз)
- медленно прокручивается и останавливается
Первый может быть обнаружен
scrollViewDidEndDecelerating
и другими подобными методами, а два других - нет.К счастью, у нас
UIScrollView
есть три состояния, которые мы можем использовать для их идентификации, что используется в двух строках с комментариями «// 1» и «// 2».источник