如何确定scrollView是否要向上或向下滚动

时间:2012-04-06 17:43:48

标签: objective-c ios cocoa-touch scrollview

我想知道scrollView是向上还是向下滚动。理想情况下,如果向上或向下滚动scrollView,我只想进行一次调用。我试过了,但显然没有告诉我任何方向:

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    NSLog(@"%.2f", scrollView.contentOffset.y);
}

contentOffset将始终为0 - 无论我是向上还是向下滚动都无关紧要。现在我可以简单地检查 - (void)scrollViewDidScroll:如果偏移量是正数或负数,但这是不断调用的。 scrollViewWillBeginDragging的优点是只调用一次,这就是我需要的。是否有类似scrollViewDidBeginDragging的东西?我没有在文档中找到任何内容。任何聪明的解决方法?

4 个答案:

答案 0 :(得分:12)

将初始内容偏移量存储在scrollViewWillBeginDragging:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    self.initialContentOffset = scrollView.contentOffset.y;
    self.previousContentDelta = 0.f;
}

并在每个scrollViewDidScroll:

上查看
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat prevDelta = self.previousContentDelta;
    CGFloat delta = scrollView.contentOffset.y - self.initialContentOffset;
    if (delta > 0.f && prevDelta <= 0.f) {
        // started scrolling positively
    } else if (delta < 0.f && prevDelta >= 0.f) {
        // started scrolling negatively
    }
    self.previousContentDelta = delta;
}

答案 1 :(得分:4)

IS 可以在注册任何滚动之前在scrollViewWillBeginDragging中执行此检查。 (IOS 5+)。通过检查滚动视图的内置平移手势识别器,您可以检查手势方向。

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

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

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

答案 2 :(得分:2)

创建一个声明的属性,让我们知道tableview开始滚动。让我们使用名为scrollViewJustStartedScrolling的BOOL。

scrollViewWillBeginDragging中将其设为true:

self.scrollViewJustStartedScrolling = YES;

scrollViewDidScroll中执行以下操作:

if (self.scrollViewJustStartedScrolling) {
    // check contentOffset and do what you need to do.
    self.scrollViewJustStartedScrolling = NO;
}

答案 3 :(得分:-1)

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

    if (velocity.y > 0){
        NSLog(@"up");
    } else {
        NSLog(@"down");
    }
}