Check direction of scroll in UIScrollView
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.