【问题标题】:How can I detect when a UITableView has been scroll past the very bottom/top?如何检测 UITableView 何时滚动到最底部/顶部?
【发布时间】:2015-06-13 01:52:08
【问题描述】:

我有一个包含 3 个 tableView 的视图。一个是“主表视图”,然后我有一个“答案表视图”和“百分比表视图”。

当屏幕加载时,主表视图占据屏幕顶部的 95%。屏幕底部是一个包含 2 个按钮的 UIView。 “答案”和“百分比”。

它的工作方式是,如果我单击“百分比”,它会将主表视图的高度更改为 0,并将该高度提供给答案表视图。这会将“Answers/Percentage”视图动画到顶部,并在其下方显示 Answers 或 Percentage TableView。

这是一个例子:

如您所见,我点击了“百分比”,它会对其进行动画处理。如果您再次单击“百分比”,它会重新设置动画。

但是,我想要做的是,如果“答案/百分比”视图位于视图的底部,并且用户向上滚动 Main Feed 到达 tableView 内容的最末端(不仅仅是末端,而是最后,还有一点点),我想像 .gif 那样对其进行动画处理。

类似地,如果“答案/百分比”位于顶部,并且用户向下滚动下方的“答案表视图”到上面没有更多数据的某个点,它将完全动画化。

另外,我不希望“答案/百分比”视图位于中间,并同时显示顶部和底部的表格视图。所有一个,或另一个,但不是两者兼而有之。我现在有。

我需要知道的是......我如何检测用户是否已经滚动超过表格视图的最顶部或最底部 +30 像素,例如,以启动我的动画?

【问题讨论】:

    标签: ios objective-c uitableview cocoa-touch


    【解决方案1】:

    您可以使用表格视图的 contentOffset 属性。

    if(tableView.contentOffset.y >= (tableView.contentSize.height - tableView.frame.size.height)) {
        // Start the animation
    }
    

    我没有对此进行测试,但如果它有效,请告诉我。

    【讨论】:

    • 我也会采用.contentOffset.y 方法。要包括问题中提到的 30 像素“缓冲区”,它必须说类似tableView.contentOffset.y - 30.0f >= (tableview[...]。并且:要真正有一个地方以这种方式检查 contentOffset,表格视图委托可以实现scrollViewDidScroll:(如果你想在超过 30px 阈值后立即动画)或scrollViewDidEndDragging:willDecelerate:(如果你想等待用户释放拖动)。
    • @sublimerequisite 这似乎可行,问题是,在我制作动画后,我需要能够从顶部的 tableview 中删除用户触摸。那可能吗?例如,发生的情况是它们滚动到底部,并且足够远,它会在底部的 tableView 上设置动画。手指仍然在屏幕上,他们可以将原始的 tableview 滚动回顶部。暂时不见。然后,当他们重新设置顶部 tableview 的动画时,它已滚动到顶部而不是我想要的底部。制作动画时如何踢/结束他们的触摸事件?
    • @Gamma 这似乎工作,问题是,在我做动画之后,我需要能够从顶部的 tableview 中删除用户触摸。那可能吗?例如,发生的情况是它们滚动到底部,并且足够远,它会在底部的 tableView 上设置动画。手指仍然在屏幕上,他们可以将原始的 tableview 滚动回顶部。暂时不见。然后,当他们重新设置顶部 tableview 的动画时,它已滚动到顶部而不是我想要的底部。制作动画时如何踢/结束他们的触摸事件?
    【解决方案2】:

    根据 sublimerequisite 的方法做出另一个答案,因为这样更容易格式化和发布代码。基本思想是检查表格视图的.contentOffset.y,例如通过在其委托中实现scrollViewDidScroll,并相应地触发您的动画。

    它可能有点 QnD 的感觉,但如果您还需要在触发动画时中止用户的拖动操作,一个简单的方法是“重置”表格视图的手势识别器。在可能看起来像这样的代码中:

    static const CGFloat kChrisTableViewAnimationThreshold = 30.0f;
    
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        if (scrollView == self.topTableView) {
            if([self scrolledPastBottomThresholdInTableView:self.topTableView]) {
                // Start the animation
                // ...
    
                // Toggling the table view's pangGestureRecognizer off and on cancels the gesture
                self.topTableView.panGestureRecognizer.enabled = NO;
                self.topTableView.panGestureRecognizer.enabled = YES;
            }
        }
    }
    
    - (BOOL)scrolledPastBottomThresholdInTableView:(UITableView *)tableView {
        return (tableView.contentOffset.y - kChrisTableViewAnimationThreshold >= (tableView.contentSize.height - tableView.frame.size.height));
    }
    

    请注意,这个插图显然只涵盖了识别顶部表格视图何时滚动超过其底端,但将其调整为处理其他场景应该非常简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多