【问题标题】:how to check when UITableView is done scrolling如何检查 UITableView 何时完成滚动
【发布时间】:2013-05-07 11:09:41
【问题描述】:

有没有办法检查我的 tableview 是否刚刚完成滚动? table.isDraggingtable.isDecelerating 是我能找到的仅有的两种方法。我不确定当 tableview 完成滚动时如何预测或收到通知。

如果 tableView 正在滚动,我可以以某种方式使用计时器来检查每一秒吗?

【问题讨论】:

    标签: ios objective-c uitableview uiscrollview


    【解决方案1】:

    您将按如下方式实现UIScrollViewDelegate 协议方法:

    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
        if (!decelerate) {
            [self scrollingFinish];
        }
    }
    
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
        [self scrollingFinish];
    }
    
    - (void)scrollingFinish {
        //enter code here
    }
    

    斯威夫特版本

    public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        if decelerate {
            scrollingFinished()
        }
    }
    
    public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        scrollingFinished()
    }
    
    func scrollingFinished() {
        print("scrolling finished...")
    }
    

    对于上面的委托方法The scroll view sends this message when the user’s finger touches up after dragging content. The decelerating property of UIScrollView controls deceleration.当视图减速停止时,参数decelerate将是NO

    第二个用于缓慢滚动,甚至当您的手指触摸时滚动停止,正如 Apple Documents 所说,when the scrolling movement comes to a halt

    【讨论】:

    • 用户也可以通过点击屏幕顶部来调用表格滚动。不幸的是,在这种情况下 scrollViewDidEndDecelerating 没有被调用,所以我们必须实现 scrollViewDidScrollToTop 来处理这种情况。
    • 这个答案是最好的,@JovanStankovic,你说的很对。
    【解决方案2】:

    每次用户滚动停止时,以下代码都会更新您。

    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
    {
        if (!decelerate)
        {
            if (isScrollingStart)
            {
                isScrollingStart=NO;
                [self scrollingStopped];
            }
        }
    }
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
    {
    
        if (isScrollingStart)
        {
            isScrollingStart=NO;
            [self scrollingStopped];
        }
    }
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        isScrollingStart=YES;
    }
    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    {
        isScrollingStart=YES;
    }
    -(void)scrollingStopped
    {
        NSLog(@"Scrolling stopped");
    }
    

    【讨论】:

    • 效果很好,谢谢。值isScrollingEnd 已写入但从未使用过。是否以防万一您需要使用它?您是要在 scrollingStopped 中检查它吗?
    • 更新了答案。 ,这里没有使用 isScrollingEnd :)
    【解决方案3】:

    UITableView 符合 UIScrollViewDelegate。请参阅该协议的文档,它有您需要的方法。

    【讨论】:

      【解决方案4】:

      在使用shanegao's answer 和 Jovan Stankovic 对此的评论后,我为 Swift3 设计了这个 -

      extension NMViewController: UIScrollViewDelegate {
          func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
              if !decelerate {
                  scrollViewDidEndDecelerating(scrollView)
              }
          }
      
          func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
              scrollViewDidEndDecelerating(scrollView)
          }
      
          func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
              // Your logic to handle after scrolling is done
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2010-11-02
        • 2018-11-22
        • 1970-01-01
        • 1970-01-01
        • 2017-10-14
        • 2021-03-11
        • 1970-01-01
        • 1970-01-01
        • 2015-08-15
        相关资源
        最近更新 更多