在scrollViewWillBeginDragging中检测UIScrollView滚动的方向

Jea*_*ean 21 iphone cocoa-touch ios

我做了足够的google,并且在发布之前我确实在stackoverflow中检查了这些帖子(在UIScrollView中查找滚动的方向?).我在iPhone应用程序中拥有动态数量的照片,正在显示UIScrollView.在任何时候,我只在滚动视图中显示3张照片.当我有4张照片时,总计:第1张照片:偏移量0.0显示第2张照片:偏移量320.0显示第3张照片:显示偏移量640.0

现在,当用户滚动到第4张照片时,滚动视图将重置为0.0偏移.如果用户试图滚动"超出"第4张照片,则滚动应仅在右向停止(因此用户不会滚动"超出").但是目前,用户'能够'滚动到最后一张照片之外; 但是,我以编程方式检测到此并重置偏移量.但它看起来并不整洁,因为用户会瞬间看到黑色背景.我想检测用户是否已经开始向右滚动(请记住,向左滚动'即'前一张'照片就可以了)scrollViewWillBeginDragging,以便我可以停止向右滚动.

我尝试了什么:

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

mwi*_*but 29

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 注意,如果手势太微妙,翻译可以返回零.使用CGPoint velocity = [scrollView.panGestureRecognizer velocityInView:scrollView.superview]; 代替.感谢用户Robert对此问题的评论:/sf/ask/674604241/ (3认同)

PAC*_*PAC 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
    }
}
Run Code Online (Sandbox Code Playgroud)


Osc*_*car 12

Swift 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
    }
}
Run Code Online (Sandbox Code Playgroud)


Jea*_*ean 6

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

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

  • 你能详细说明lastContentOffset吗? (2认同)

Mic*_*iel 5

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

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

   // Detect direction by accessing x or y of translation
}
Run Code Online (Sandbox Code Playgroud)

lastContentOffset... 保存实例变量