在scrollViewWillBeginDragging中检测UIScrollView滚动的方向

时间:2012-12-26 14:49:06

标签: iphone ios cocoa-touch

我足够google了,&在发布之前,我确实在stackoverflow中检查了这些帖子(Finding the direction of scrolling in a UIScrollView?)。我在iPhone应用程序中有动态数量的照片,通过UIScrollView显示。在任何时候,我只在滚动视图中显示3张照片。当我有,总共说4张照片: 第一张照片:显示偏移0.0 第二张照片:偏移320.0显示 第3张照片:显示在偏移640.0

现在,当用户滚动到第4张照片时,滚动视图将重置为0.0偏移。如果用户试图滚动“超出”第4张照片,则滚动应仅在右向停止(因此用户不会滚动“超出”)。但是目前,用户'能够'滚动到最后一张照片之外;但是,我以编程方式检测到了这一点。重置偏移量。但它看起来并不整洁,因为用户会瞬间看到黑色背景。我想检测用户是否已经开始向右滚动(请记住,在'{1}}中滚动'左'即'上一张'照片是可以的',这样我就可以停止向右滚动。< / p>

我尝试了什么:

  1. 尝试使用scrollViewWillBeginDragging self.scrollView.panGestureRecognizer无效,因为没有 translationInView实例首先返回(!), 虽然UIScrollView API声称如此。
  2. 虽然可以在panGestureRecognizer中检测到这一点 它不会达到我的目的。

9 个答案:

答案 0 :(得分:27)

在检查滚动视图的scrollViewWillBeginDragging时,panGestureRecognizer确定方向没有问题:

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

    if(translation.y > 0)
    {
        // react to dragging down
    } else
    {
        // react to dragging up
    }
}

我发现当用户在禁止的方向拖动时,在第一次拖动移动时取消滚动非常有用。

答案 1 :(得分:12)

对于swift 2.0+&amp; ios 8.0 +

func scrollViewWillBeginDecelerating(scrollView: UIScrollView) {
    let actualPosition = scrollView.panGestureRecognizer.translationInView(scrollView.superview)
    if (actualPosition.y > 0){
        // Dragging down 
    }else{
        // Dragging up
    }
}

答案 2 :(得分:9)

Swift 3解决方案

1-添加UIScrollViewDelegate

2-添加此代码

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
    let actualPosition = scrollView.panGestureRecognizer.translation(in: scrollView.superview)
    if (actualPosition.y > 0){
        // Dragging down
    }else{
        // Dragging up
    }
}

答案 3 :(得分:6)

谢谢你,克里斯。这最终对我有用:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // Detect the scroll direction
    if (lastContentOffset < (int)scrollView.contentOffset.x) {
    ...
    }
}

答案 4 :(得分:5)

这是我使用的,至少在iOS 6.0上它很好用:

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

   // Detect direction by accessing x or y of translation
}

lastContentOffset ...

保存实例变量

答案 5 :(得分:1)

基于iOS 7+中scrollView的pan识别器的转换,似乎存在检测滚动方向的问题。这似乎是为了我的目的而无缝地工作

func scrollViewDidScroll(scrollView: UIScrollView) {
    if !scrollDirectionDetermined {
        let translation = scrollView.panGestureRecognizer.translationInView(self.view)
        if translation.y > 0 {
            println("UP")
            scrollDirectionDetermined = true
        }
        else if translation.y < 0 {
            println("DOWN")
            scrollDirectionDetermined = true
        }
    }
}

func scrollViewWillBeginDragging(scrollView: UIScrollView) {
    scrollDirectionDetermined = false
}

func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    scrollDirectionDetermined = false
}

答案 6 :(得分:0)

看看scrollViewWillEndDragging:withVelocity:targetContentOffset:。 您可以使用该方法执行任何检查并查看它是否应该在不应该的位置,然后在方法中您可以设置新的targetContentOffset

the documentation

  

当滚动视图的pagingEnabled属性的值为YES时,不会调用此方法。您的应用程序可以更改targetContentOffset参数的值,以调整scrollview完成滚动动画的位置。

答案 7 :(得分:0)

scrollView.panGestureRecognizer translationInView:scrollView不会在iOS 7中scrollViewWillBeginDragging报告任何有用的内容。

这样做:

@interface

BOOL scrollDirectionDetermined;

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (!scrollDirectionDetermined) {
        if ([scrollView.panGestureRecognizer translationInView:scrollView.superview].x > 0) {
            //scrolling rightwards
        } else {
             //scrolling leftwards
       }
    scrollDirectionDetermined = YES;
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    scrollDirectionDetermined = NO;
}

答案 8 :(得分:0)

建立@ Oscar的答案,你可以做一些事情,比如

scrollView.bounces = actualPosition.y < 0如果您希望滚动到底部时滚动视图反弹,但滚动到顶部时不滚动