22

我做了足够的谷歌,并且在发布之前我确实在stackoverflow中检查了这样的帖子(在UIScrollView中找到滚动的方向? )。我在 iPhone 应用程序中有动态数量的照片,通过UIScrollView. 在任何时候,滚动视图中都只显示了 3 张照片。当我总共有 4 张照片时: 第一张照片:显示在偏移量 0.0 第二张照片:显示在偏移量 320.0 第三张照片:显示在偏移量 640.0

现在,当用户滚动到第四张照片时,滚动视图重置为 0.0 偏移量。如果用户试图滚动“超出”第 4 张照片,则滚动应该只在右侧停止(这样用户就不会滚动“超出”)。但目前,用户“能够”滚动到最后一张照片之外;但是,我以编程方式检测到这一点并重置偏移量。但它看起来并不整洁,因为用户会暂时看到黑色背景。我想检测到用户已经开始滚动“右”(记住,滚动“左”,即到“上一张”照片是可以的)scrollViewWillBeginDragging,这样我就可以停止向右滚动。

我尝试了什么:

  1. 尝试使用self.scrollView.panGestureRecognizer's translationInView不起作用,因为首先没有 panGestureRecognizer返回实例(!),尽管 UIScrollView API 声称如此。
  2. 检测到这一点scrollViewDidEndDecelerating是可能的,尽管它不符合我的目的。
4

9 回答 9

28

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

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

于 2013-10-16T19:44:37.923 回答
15

斯威夫特 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
    }
}
于 2017-02-28T09:27:50.510 回答
12

对于 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
    }
}
于 2016-03-21T09:20:56.530 回答
6

谢谢你,克里斯。这对我有用,最后:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // Detect the scroll direction
    if (lastContentOffset < (int)scrollView.contentOffset.x) {
    ...
    }
}
于 2012-12-27T14:01:48.793 回答
5

这是我使用的,它至少在 iOS 6.0 上运行良好:

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

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

为您保存实例变量lastContentOffset...

于 2013-06-06T14:20:42.457 回答
1

看看scrollViewWillEndDragging:withVelocity:targetContentOffset:。您可以使用该方法进行任何检查,看看它是否在不应该的地方,然后在该方法中您可以设置一个新的targetContentOffset.

根据文档

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

于 2012-12-26T15:07:27.243 回答
1

根据 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
}
于 2015-04-22T17:36:50.193 回答
0

scrollView.panGestureRecognizer translationInView:scrollViewscrollViewWillBeginDragging在 iOS 7中没有报告任何有用的信息。

这样做:

在里面@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;
}
于 2014-05-09T22:18:49.623 回答
0

基于@Oscar 的回答,您可以执行以下操作

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

于 2017-04-10T20:38:40.347 回答