在scrollViewWillBeginDragging中检测UIScrollView的滚动方向

我没有足够的谷歌,我没有检查这些post( 在UIScrollView中查找滚动的方向? )在发布之前在计算器中。 我有一个iPhone应用程序中的dynamic数量的照片,通过UIScrollView显示。 在任何时候,我只有3张照片显示在滚动视图中。 当我有,总共说4张照片:第一张照片:显示在偏移0.0第二张照片:显示在偏移320.0第三张照片:显示在偏移640.0

现在,当用户滚动到第4张照片时,滚动视图重置为0.0偏移量。 如果用户试图滚动“超出”第四张照片,滚动只应停止在正确的方向(以便用户不滚动“超出”)。 但是目前,用户能够滚动到最后一张照片之外; 但是,我检测到这个编程方式&重置偏移量。 但它看起来不整齐,因为用户瞬间看到黑色背景。 我想检测到用户已经开始滚动“右”(记住,滚动“左”,即“先前”的照片是好的)在scrollViewWillBeginDragging ,以便我可以停止进一步滚动向右。

我试过的:

  1. 尝试使用self.scrollView.panGestureRecognizertranslationInView不起作用,因为没有panGestureRecognizer实例在第一个地方(!)返回,尽pipeUIScrollView API声称如此。
  2. scrollViewDidEndDecelerating检测到这scrollViewDidEndDecelerating是可能的,尽pipe它不会达到我的目的。

在检查滚动视图的panGestureRecognizer时,我没有在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 } } 

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

适用于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 } } 

这是我使用的,它至less在iOS 6.0上很好地工作:

 - (void)scrollViewDidScroll:(UIScrollView*)scrollView { CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView]; // Detect direction by accessing x or y of translation } 

lastContentOffset保存实例variables…

谢谢你,克里斯。 这对我来说很有效,最后:

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

Swift 3解决scheme

1-添加UIScrollViewDelegate

2-添加此代码

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

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

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

根据文档 :

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

scrollView.panGestureRecognizer translationInView:scrollView不会在iOS 7的scrollViewWillBeginDragging中报告任何有用的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; } 

build立@奥斯卡的答案,你可以做的事情

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