2012-12-26 35 views
18

我没有足够的谷歌,&我在发布之前在stackoverflow中检查了这些文章(Finding the direction of scrolling in a UIScrollView?)。我有一个iPhone应用程序中的动态照片数量,通过UIScrollView显示。在任何时候,我只有3张照片显示在滚动视图中。当我有,说4张,总数: 1日的照片:显示在偏移0.0 第2张照片:在偏移320.0 3日的照片显示:显示在偏移640.0在scrollViewWillBeginDragging中检测UIScrollView的滚动方向

现在,当用户滚动到第4的照片,滚动视图重置为0.0偏移量。如果用户试图滚动'超出'第4张照片,滚动只应停止在正确的方向(以便用户不滚动'超出')。但目前,用户'能够'滚动到最后一张照片之外;但是,我通过编程检测到&重置了偏移量。但它看起来并不整齐,因为用户会立即看到黑色背景。我想检测用户是否已经开始滚动'right'(记住,滚动'left',即'previous'photo okir)在scrollViewWillBeginDragging中,这样我就可以停止向右滚动。

我想什么:(!)

  1. 使用self.scrollView.panGestureRecognizertranslationInView工作不尽力,因为首先没有返回 panGestureRecognizer例如, 虽然UIScrollView的API声称如此。
  2. 检测到scrollViewDidEndDecelerating是可能的,但 它不符合我的目的。

回答

6

谢谢你,克里斯。这是为我工作,最后:

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

你能否详细说明反弹lastContentOffset – Daniel

+1

@Daniel您需要保存“最后内容偏移”,这是从上一次这种方法被称为先前contentOffset。我不知道吉恩为什么忘了它。只需在顶部添加lastContentOffset作为静态变量,然后将其设置在方法的末尾。 –

0

看看scrollViewWillEndDragging:withVelocity:targetContentOffset:。 您可以使用该方法做任何检查,看看它是否应该去哪里,然后在该方法中,您可以设置一个新的targetContentOffset

the documentation

这种方法不叫当滚动视图pagingEnabled属性的值是YES。您的应用程序可以更改targetContentOffset参数的值,以调整滚动视图完成其滚动动画的位置。

5

这是我用什么,它工作得很好,至少在iOS 6.0:

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

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

节省您lastContentOffset实例变量...

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

翻译似乎总是为零(至少在iOS7.1中) –

+1

翻译有时会为零,所以这只是'kindof'的作品(iOS 8.3) – wbarksdale

+0

使用'scrollViewDidScroll'而不是 –

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

似乎有与检测滚动方向基地问题d在iOS 7+中翻译scrollView的泛识别器。这似乎是我的目的,

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

为SWIFT 2.0+ & IOS 8.0+

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

斯威夫特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 
    } 
} 
0

大厦关闭@奥斯卡的答案,你可以做这样的事情

scrollView.bounces = actualPosition.y < 0如果你想了滚动当您滚动至底部,但不是当你滚动到顶部