Обнаруживать, если прокрутка UIScrollView
Я ищу, чтобы определить, если (а не когда) прокрутка UIScrollView
.
то есть.
BOOL isScrolling = myscrollview.scrolling;
Как я могу это реализовать? .dragging
и .decelerating
не применяются, когда используется setContentOffset:animated:
.
Ответы
Ответ 1
Это может быть немного изворотливый способ сделать это, но я использовал его в своем коде раньше, и он еще не подвел меня.:)
#import <QuartzCore/QuartzCore.h>
---
BOOL isScrolling = [scrollView.layer animationForKey:@"bounds"] != nil;
В дополнение к "self.contentOffset" смещение UIScrollView сохраняется также в свойстве "bounds.origin" UIView (я предполагаю, что это немного более удобно в коде нижнего уровня). Когда вы вызываете [setContentOffset: анимированный:], он передает это сообщение в UIScrollView как CABasicAnimation, манипулируя свойством "bounds".
Конечно, эта проверка также вернет true, если сама форма scrollView анимации. В этом случае вам может потребоваться фактически вытащить объект bound из анимации ([CAAnimation toValue]) и провести ручное сравнение, чтобы увидеть, действительно ли изменяется "происхождение".
Это не самое элегантное решение, но мне нравится быть в состоянии избежать необходимости использовать делегата там, где это возможно. Особенно, если рассматриваемый класс является подклассом UIScrollView.:)
Ответ 2
Обычно я делаю это, устанавливая логическую переменную в событиях scrollViewWillBeginDragging:
и scrollViewDidEndDragging:willDecelerate:
.
Документы UIScrollView
Ответ 3
Не очень чистое решение.. но должно быть самым надежным:
var isScrolling = false
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
isScrolling = true
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if !decelerate { scrollViewDidEndScrolling(scrollView) }
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
scrollViewDidEndScrolling(scrollView)
}
func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
scrollViewDidEndScrolling(scrollView)
}
func scrollViewDidEndScrolling(_ scrollView: UIScrollView) {
isScrolling = false
}
Ответ 4
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;
использовать флаг для сохранения текущего статуса прокрутки?
он может решить проблему setContentOffset: анимированный:.
"Прокрутка" - это просто эффект, существует множество способов сделать прокрутку прокрутки, например. постоянно устанавливайте смещение содержимого. Поэтому для этого вопроса не должно быть НИКАКИХ ответов.