Подтвердить что ты не робот

Обнаруживать, если прокрутка UIScrollView

Я ищу, чтобы определить, если (а не когда) прокрутка UIScrollView.

то есть.

BOOL isScrolling = myscrollview.scrolling;

Как я могу это реализовать? .dragging и .decelerating не применяются, когда используется setContentOffset:animated:.

4b9b3361

Ответ 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: анимированный:.

"Прокрутка" - это просто эффект, существует множество способов сделать прокрутку прокрутки, например. постоянно устанавливайте смещение содержимого. Поэтому для этого вопроса не должно быть НИКАКИХ ответов.