Как я могу определить направление прокрутки из UICollectionView?

У меня есть UICollectionView. Я хочу определить направление прокрутки. У меня есть два разных стиля анимации для прокрутки вниз и вверх. Поэтому я должен выучить направление прокрутки.

CGPoint scrollVelocity = [self.collectionView.panGestureRecognizer
velocityInView:self.collectionView.superview];

if (scrollVelocity.y > 0.0f)   
NSLog(@"scroll up");

else if(scrollVelocity.y < 0.0f)    
NSLog(@"scroll down");

Это просто работа по касанию пальца. Не работает для меня


person sonifex    schedule 29.06.2014    source источник


Ответы (4)


Попробуй это:

Добавьте это где-нибудь в заголовок:

@property (nonatomic) CGFloat lastContentOffset;

Затем переопределите метод scrollViewDidScroll::

#pragma mark - UIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (self.lastContentOffset > scrollView.contentOffset.y)
    {
        NSLog(@"Scrolling Up");
    }
    else if (self.lastContentOffset < scrollView.contentOffset.y)
    {
        NSLog(@"Scrolling Down");
    }

    self.lastContentOffset = scrollView.contentOffset.y;
}

Найдено в Как найти направление прокрутки в UIScrollView?

person Douglas Ferreira    schedule 30.06.2014

это лучший способ получить направление прокрутки, надеюсь, это поможет вам

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {

    CGPoint targetPoint = *targetContentOffset;
    CGPoint currentPoint = scrollView.contentOffset;

    if (targetPoint.y > currentPoint.y) {
        NSLog(@"up");
    }
    else {
        NSLog(@"down");
    }
}
person Patel Jigar    schedule 15.04.2016
comment
Перетаскивание ... Разве это не о перетаскивании пальцем? Прокрутка может происходить даже без пальца пользователя, не так ли? - person iWheelBuy; 22.02.2020

Swift 4.2

private var lastContentOffset: CGFloat = 0
func scrollViewDidScroll(_ scrollView: UIScrollView) {

    if lastContentOffset > scrollView.contentOffset.y && lastContentOffset < scrollView.contentSize.height - scrollView.frame.height {
        // move up
        print("move up")
        originalHeight ()
    } else if lastContentOffset < scrollView.contentOffset.y && scrollView.contentOffset.y > 0 {
        // move down
        print("move down")
        minimizeHeaderView()
    }

    // update the new position acquired
    lastContentOffset = scrollView.contentOffset.y
}
person Gerges Eid    schedule 14.09.2019

Я пытался найти способ определить, пытается ли пользователь в основном тянуть вертикально или горизонтально scrollView. Предлагаю вам свое решение, надеюсь, оно может быть кому-нибудь полезно:

CGPoint _lastContentOffset;

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    _lastContentOffset = scrollView.contentOffset;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    if (ABS(_lastContentOffset.x - scrollView.contentOffset.x) < ABS(_lastContentOffset.y - scrollView.contentOffset.y)) {
        NSLog(@"Scrolled Vertically");
    } else {
        NSLog(@"Scrolled Horizontally");
    }

}

Эта работа находит для меня, и я использую это, чтобы избежать перемещения scrollView по горизонтали при прокрутке по вертикали и наоборот.

person Robin Delaporte    schedule 23.02.2016