Check direction of scroll in UIScrollView

只谈情不闲聊 提交于 2019-11-29 04:52:00

In scrollViewWillBeginDragging the scroll view has not yet moved (or registered the move) and so contentOffset will by 0. As of IOS 5 you can instead look in the scrollview's panGestureRecognizer to determine the direction and magnitude of the user's scrolling gesture.

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{ 
    CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview];

    if(translation.x > 0)
    {
        // react to dragging right
    } else
    {
        // react to dragging left
    }
}

Make a CGFloat lastOffset as a member variable in your class.h file..

then set it 0 in viewDidLoad .

then check in

        - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

    {
    if (scrollView.contentOffset.x < lastOffset) // has scrolled left..
    {
         lastOffset = scrollView.contentOffset.x;
        [self NextQuestion:scrollView];
    }

}

You can keep a starting offset as a member of your class which you store when the delegate receives the scrollViewDidBeginDragging: message. Once you have that value you can compare the x value of the scroll view offset with the one you have stored and see whether the view was dragged left or right.

If changing direction mid-drag is important, you can reset your compared point in the viewDidScroll: delegate method. So a more complete solution would store both the last detected direction and the base offset point and update the state every time a reasonable distance has been dragged.

- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat distance = lastScrollPoint.x - scrollView.contentOffset.x;
    NSInteger direction = distance > 0 ? 1 : -1;
    if (abs(distance) > kReasonableDistance && direction != lastDirection) {
        lastDirection = direction;
        lastScrollPoint = scrollView.contentOffset;
    }
}

The 'reasonable distance' is whatever you need to prevent the scrolling direction to flip between left and right to easily but about 10 points should be about enough.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!