scrollToRowAtIndexPath 在 3/4 行之后没有滚动到正确的行

Posted

技术标签:

【中文标题】scrollToRowAtIndexPath 在 3/4 行之后没有滚动到正确的行【英文标题】:scrollToRowAtIndexPath not scrolling to correct row after 3/4 of rows 【发布时间】:2010-10-04 14:53:46 【问题描述】:

我有一个带有大约 100 行的 UITableView 的 iPad 应用程序。单元格是自定义的,我已经实现了 heightForRowAtIndexPath 来告诉 UITableView 我的单元格有多大。

我正在使用这个:

   [tableView scrollToRowAtIndexPath:indexPath 
              atScrollPosition:UITableViewScrollPositionMiddle animated:NO];

将表格滚动到给定的行。这非常适用于第 1-75 行。第 76 行稍微偏离了中间,76-79 稍微偏离了一些,从第 80 行开始,它根本不再滚动到正确的位置。它只是保持不变,第 79 行是最后一个可见行。发生这种情况时,我仍然可以通过拖动手指来手动滚动表格;显然还没有结束。然而,似乎以编程方式,scrollToRowAtIndexPath 认为它在实际到达之前已经到达了表的末尾。我希望这种行为出现在表的末尾,而不是行的 3/4。

我正在努力调试这里发生的事情;我将不胜感激任何可以帮助我找出为什么在我调用 scrollToRowAtIndexPath 时表认为它已经在末尾的指针。

【问题讨论】:

更新:问题似乎是 tableview 所属的视图本身的大小不正确。它设置为自动调整大小,但它继续使用它在 nib 文件中的大小(此视图是最顶层的视图)。因为这比它添加到的视图大,所以表的末端位于视图边界之外。知道了这一点,可能会更容易找到解决方案,但我一直找不到。 【参考方案1】:

我遇到了同样的问题,我想我明白会发生什么:表格视图已经在执行另一个动画,而 scrollToRowAtIndexPath 被忽略了。将方法包装在 CATransaction 块中对我有用(快速代码):

CATransaction.begin()

tableView.beginUpdates()
tableView.scrollToRowAtIndexPath(cell.indexPath, atScrollPosition: .Middle, animated: true)
tableView.endUpdates()

CATransaction.commit()

另一个对我有用的解决方案是使用 performSelectorWithDelay,延迟足够长,可以让 table view 上的其他动画完成。

【讨论】:

一整天都在寻找解决方案。我的问题是系统正在计算最后一个单元格,只是稍微偏离了一点。这是有效的!非常感谢! 谢谢先生!这对我有用,确实是由于 .reloadSections 动画在我尝试 .scrollToRow 的同时发生 这有帮助,但不能解决可变单元格高度滚动问题。【参考方案2】:

我注意到这个问题被很多人关注,所以可能会有更多人遇到这个问题。最终我发现这不是 tableview 的问题。当旋转设备或从代码调整其大小时,它被定位在行为异常的视图中。 tableview 实际上超出了它所在视图的边界,所以输出看起来很奇怪,但如果你认为 tableview 结束于屏幕边界之外,它实际上是有道理的。

我通过清理视图层次结构并确保调整大小和旋转正常工作来解决这个问题。

【讨论】:

【参考方案3】:

尝试:

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:indexRow inSection:indexSection] 
                 atScrollPosition:UITableViewScrollPositionMiddle animated:NO];

【讨论】:

【参考方案4】:

你写你已经覆盖了 heightForRowAtIndexPath:,但是没有什么可以覆盖的。您应该有一个实现 UITableViewDelegate 协议的委托,供 tableView 调用。

如果情况已经如此,您应该通过记录 heightForRowAtIndexPath 中的值来检查您的委托是否正常工作,或者在那里中断。

【讨论】:

是的,对不起,我就是这个意思;调用了高度函数并且值是正确的(我也可以从单元格中看出;它们都被正确渲染了)。

以上是关于scrollToRowAtIndexPath 在 3/4 行之后没有滚动到正确的行的主要内容,如果未能解决你的问题,请参考以下文章

scrollToRowAtIndexPath 错误

UITableView scrollToRowAtIndexPath

scrollToRowAtIndexPath 在 Top 时必须调用两次

我对“scrollToRowAtIndexPath”有疑问。我得到这个错误。 (我已经上传了课程)

scrollToRowAtIndexPath 在 3/4 行之后没有滚动到正确的行

scrollToRowAtIndexPath 上非常奇怪的 UITableViewController.tableview 行为