【问题标题】:How to know in which way UITableView is being scrolled如何知道 UITableView 以哪种方式滚动
【发布时间】:2012-07-17 05:24:50
【问题描述】:

有什么方法可以知道UITableView是向上还是向下滚动?

【问题讨论】:

    标签: iphone ios ipad uitableview


    【解决方案1】:
    -(void) scrollViewDidScroll:(UIScrollView *)scrollView
    {
        CGPoint currentOffset = scrollView.contentOffset;
        if (currentOffset.y > self.lastContentOffset.y)
        {
            // Downward
        }
        else
        {
            // Upward
        }
        self.lastContentOffset = currentOffset;
    }
    

    【讨论】:

    • 您好,我需要帮助来实现这一点。你在哪里设置 self.lastContentOffset?谢谢:)
    • 您好,只需在您的滚动委托类中定义一个属性。 @property (assign, nonatomic) CGPoint lastContentOffset;
    【解决方案2】:
    -(void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
                        withVelocity:(CGPoint)velocity 
                 targetContentOffset:(inout CGPoint *)targetContentOffset{
    
        if (velocity.y > 0){
            NSLog(@"up");
        }
        if (velocity.y < 0){
            NSLog(@"down");
        }
    }
    

    【讨论】:

    • 如果你想制作一个自制的拉动刷新(或其他视图偏移相关行为),这个方法是你在检测滚动视图的偏移量时绑定的地方 - 而不是 targetContentOffset (那是动画结束后滚动结束的位置):if (scrollView.contentOffset.y&lt;0){ // scroll is above 0,0 aka negative space where the refreshview would be }
    • “上”和“下”必须交换吗?
    • @NikKov 你是什么意思?
    • 在iOS 12上,如果拖得很慢,velocity.y会为0,所以无法判断方向。
    【解决方案3】:

    我们可以这样做吗?

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    
          if ([scrollView.panGestureRecognizer translationInView:scrollView].y > 0) {
            // down
          } else {
            // up
          }
    
        }
    

    【讨论】:

    • 这将根据最初的触摸向上或向下发送,因此如果您从 pt200 开始,向上移动到 pt100 并向下移动到 pt199,无论如何您都会获得向上状态
    • 完美!这样就解决了 UIScrollView 弹跳改变滚动方向的问题。
    • 这不是真的,如果你向下滚动让我们说 100.0pt 和 1.0pt 向上,你的代码将触发向下部分(translation.y 将是 99.0)
    【解决方案4】:

    UITableViewUIScrollView 的子类,因此您可以将自己设置为UIScrollViewDelegate 并获取滚动视图委托回调。

    这些委托方法之一 (-scrollViewDidScroll:) 的参数是滚动的滚动视图,您可以将它与您的表格视图进行比较,以了解滚动的滚动视图。


    对不起,我看错了你的问题。我以为你想知道 哪个 表视图正在滚动(我错过了“方式”)。

    要知道方向,您可以将先前的偏移量保留在变量中,并查看增量(current.y - previous.y)是正数(向下滚动)还是负数(向上滚动)。

    【讨论】:

      【解决方案5】:

      您可以跟踪内容偏移量的差异。将旧的保留在成员/静态变量中并检查当前。如果旧值较低,则滚动向下,反之亦然。

      【讨论】:

        【解决方案6】:
          override func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        
                if targetContentOffset.memory.y < scrollView.contentOffset.y {
                    //println("Going up!")
        
                } else {
                   // println("Going down!")
        
                }
            }
        

        【讨论】:

          【解决方案7】:

          你可以通过这种方式实现UIScrollView的委托方法来做到这一点,很优雅。

          PS:lastOffsetscrollingUpward 是 ViewController 的属性。

          - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
              CGPoint currentOffset = scrollView.contentOffset;
              self.scrollingUpward = currentOffset.y > self.lastOffset.y;
              self.lastOffset = currentOffset;
          }
          

          【讨论】:

            【解决方案8】:
            - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
            {
               if (yourTableView.isDragging || yourTableView.isDecelerating)
                   {
                            // your tableview is scrolled.
                           // Add your code here
                   }
            }
            

            这里你必须替换你的tableview名称而不是“yourTableView”。

            yourTableView.isDragging - 如果用户开始滚动,则返回 YES。这可能需要一些时间或距离才能开始。

            yourTableView.isDecelerating - 如果用户没有拖动(触摸向上)但滚动视图仍在移动,则返回 YES。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-07-05
              • 1970-01-01
              • 1970-01-01
              • 2015-02-15
              • 1970-01-01
              • 1970-01-01
              • 2014-02-11
              • 2011-03-28
              相关资源
              最近更新 更多