如何找出scrollView即将向上还是向下滚动
我想知道scrollView是向上还是向下滚动。理想情况下,如果scrollView向上或向下滚动,我只想要调用一次。我试过,但它显然不会告诉我任何有关的方向:如何找出scrollView即将向上还是向下滚动
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
NSLog(@"%.2f", scrollView.contentOffset.y);
}
contentOffset将始终为0 - 没关系我是否上下滚动时。现在我可以简单地检入 - (void)scrollViewDidScroll:如果偏移量是正数或负数,但是这会不断调用。 scrollViewWillBeginDragging的优点是只被调用一次,这就是我所需要的。有没有像scrollViewDidBeginDragging?我没有在文档中找到任何内容。任何智能解决方法?
创建一个声明的属性让我们知道tableview开始滚动。我们使用名为scrollViewJustStartedScrolling
的BOOL。
在scrollViewWillBeginDragging
其设置为true:
self.scrollViewJustStartedScrolling = YES;
在scrollViewDidScroll
做这样的事情:
if (self.scrollViewJustStartedScrolling) {
// check contentOffset and do what you need to do.
self.scrollViewJustStartedScrolling = NO;
}
存储初始内容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;
}
您不需要存储initialContentOffset,因为它始终为0. – lnafziger 2012-04-06 18:03:12
非常有意义。我忘记了所有关于想要在触摸中改变主意的用户。非常感谢。 – 2012-04-06 18:06:25
@Inafziger'contentOffset'不是从滚动开始的偏移量,它是整个滚动视图的偏移量。如果它在拖动开始时总是为零,为什么我们会担心可能会滚动? – 2012-04-06 18:06:40
它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
}
}
我发现它非常有用,用于在用户拖动禁止方向时在首次拖动时取消滚动。
**请注意,如果手势过于微妙,翻译可以返回零。**使用CGPoint速度= [scrollView.panGestureRecognizer velocityInView:scrollView.superview];'''来代替。 – Robert 2014-04-29 14:45:00
此外请注意,如果您轻弹一个UIScrollView,然后在视图仍然减速时触摸并按住,scrollViewWillBeginDragging将以x = y = 0的平移和速度进行调用。所以最好不要假设'''else {...} '''将会'''向左拖动'''。确保零的平移/速度值。 – Robert 2014-04-29 19:26:54
-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
if (velocity.y > 0){
NSLog(@"up");
} else {
NSLog(@"down");
}
}
如果用户放下手指,开始向下滚动,然后改变主意并向上滚动,该怎么办? – 2012-04-06 17:46:47
@JohnCalsbeek如果他滚动 0时我调用的动作。 – 2012-04-06 17:53:18