使用UITableView
估算的行高非常适合性能,但是当尝试使用表格视图获得精确的滚动偏移时,男孩会很头疼。
This article from Ray Wenderlich详细介绍了底部的一些问题。 As does this article。当您转到新的视图控制器然后返回到表视图后,表视图会完全混淆您的位置,并且不会将用户返回到先前的位置。旋转有时甚至可以简单滚动。
我无法帮助但想知道...... 有什么意义呢?它不应该让你回到原来的位置吗?
我知道估计很难,但是除了给出完美的估计值(那么它们是不是真的估计并且无法达到目的)之外,没有办法实现这个目标吗?因为现在除非有一个包含单元格的单个视图控制器,否则任何其他情况(例如转换到新的视图控制器)似乎真的搞砸了它。
如何以实际有用的方式使用估算值,并且不会导致跳到各处?
答案 0 :(得分:0)
我遇到了与你完全相同的问题 - 在UIPageViewController中嵌入了不同行高的UITableView。 TableView会滚动得很好,我会轻扫并回到桌子上,而且位置将遍布整个地方。
如this article所示,使用estimatedHeightForRowAtIndexPath和heightForRowAtIndexPath是我的诀窍。从那时起,每当我擦开并重新回到桌子上时,位置将保持不变。乌拉!
但仍然存在一个问题:第一次加载表时,estimatedRowHeights只获得单元格的后半部分(例如,32个单元格中的第16到31行),因此可以让您启动在中间。一旦我滚动,单元格的前半部分(行0到15)将加载,我将返回第0行而不是第15行。之后,表格将表现良好。
虽然是一个小问题,但解决方法是在最后一个单元格加载后模拟向上滚动。这会触发第一个单元格的加载,并将您的表格带到“正确”的第0行。
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
// return whatever the cell height should be
return myCellsArray[indexPath.row]["height"] as CGFloat
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
// return whatever the cell height should be
return myCellsArray[indexPath.row]["height"] as CGFloat
}
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
// Check that the final cell has been loaded and that this is the first time the table is loaded
if indexPath.row == myCellsArray.count - 1 && myStruct.tableHasLoaded == false{
// Reached the bottom
println("bottom reached with cell \(indexPath.row)")
// Simulate a mini scroll backwards as estimatedRowHeight only starts halfway and loads the final half, not the first half of the cells
// This way it forces it to go back to row 0
self.setContentOffset(CGPoint(x: 0, y: -1), animated: false)
// Set bool to true - we don't want to go back to the top everytime we reach the bottom of the table
myStruct.tableHasLoaded = true
}
}