2012-04-06 47 views
4

我想知道scrollView是向上还是向下滚动。理想情况下,如果scrollView向上或向下滚动,我只想要调用一次。我试过,但它显然不会告诉我任何有关的方向:如何找出scrollView即将向上还是向下滚动

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

contentOffset将始终为0 - 没关系我是否上下滚动时。现在我可以简单地检入 - (void)scrollViewDidScroll:如果偏移量是正数或负数,但是这会不断调用。 scrollViewWillBeginDragging的优点是只被调用一次,这就是我所需要的。有没有像scrollViewDidBeginDragging?我没有在文档中找到任何内容。任何智能解决方法?

+1

如果用户放下手指,开始向下滚动,然后改变主意并向上滚动,该怎么办? – 2012-04-06 17:46:47

+0

@JohnCalsbeek如果他滚动<0,那么我需要取消当他滚动> 0时我调用的动作。 – 2012-04-06 17:53:18

回答

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; 
} 
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

您不需要存储initialContentOffset,因为它始终为0. – lnafziger 2012-04-06 18:03:12

+0

非常有意义。我忘记了所有关于想要在触摸中改变主意的用户。非常感谢。 – 2012-04-06 18:06:25

+1

@Inafziger'contentOffset'不是从滚动开始的偏移量,它是整个滚动视图的偏移量。如果它在拖动开始时总是为零,为什么我们会担心可能会滚动? – 2012-04-06 18:06:40

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 
    } 
} 

我发现它非常有用,用于在用户拖动禁止方向时在首次拖动时取消滚动。

+1

**请注意,如果手势过于微妙,翻译可以返回零。**使用CGPoint速度= [scrollView.panGestureRecognizer velocityInView:scrollView.superview];'''来代替。 – Robert 2014-04-29 14:45:00

+0

此外请注意,如果您轻弹一个UIScrollView,然后在视图仍然减速时触摸并按住,scrollViewWillBeginDragging将以x = y = 0的平移和速度进行调用。所以最好不要假设'''else {...} '''将会'''向左拖动'''。确保零的平移/速度值。 – Robert 2014-04-29 19:26:54

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

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