我在iOS 7中使用UITableView中的estimatedRowHeight
方法,它非常适合快速加载具有5000行可变高度的UITableView。
我的UITableView由50个部分组成。每个部分有100行,高度可变。一开始我使用estimatedRowHeight
进行快速加载,但是之后当我调用scrollToRowAtIndexPath
时,我的UITableView滚动到错误的偏移量。我可以理解为什么会这样,因为在我滚动整个表格并且在heightForRowAtIndexPath
委托方法中设置了适当的单元格高度之前,它都有一个estimatedRowHeight
。
有什么解决方案吗?
发布于 2014-01-07 21:40:08
不幸的是,当您的代码中使用estimatedRowHeight
的值如此之低时,这个问题是意料之中的。当你计算时,它不会主动计算的正确大小。潜在的原因是,如果你从第一部分滚动到第二部分,如果它是一个相对较新的设备,它可以很容易地计算出单元的正确位置和estimatedRowHeight
。任何较旧的设备都会瘫痪,例如,如果您必须处理5000个单元,那么即使是任何新的设备也是如此。
你的问题的一个可能的解决方案可能是增加estimatedRowHeight
常量,这样设备就不需要做太多的工作。
发布于 2017-03-27 14:47:18
当调用scrollToRowAtIndexPath
时,不计算所有单元格的高度b/w当前位置和目标偏移量。只有他们中的一些人是。
相反,UITableView使用estimatedRowHeight
计算目标偏移量,这会导致错误的偏移量。
我正面临着同样的问题,我发现了一个小技巧(我真的不喜欢),在初始relaodData
之后只计算一次确切的单元格高度。我在下面插入了两行:
tableView.reloadData()
// only for the initial reloadData
let numSections = tableView.numberOfSections
let numRowsInLastSection = tableView.numberOfRowsInSection(numSections-1)
// scrolls to the last row in the tableView
tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: numRows-1, inSection: numSections-1), atScrollPosition: .Bottom, animated: false)
// back again to the original position(which is 0 for this is only called right after the initial reloadData)
tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: false)
这会导致tableView延迟出现在屏幕上,但我认为这是可以接受的,而不是在tableView出现后冻结UI。在开始调用API时甚至更好,因为它感觉像是网络上的一个小延迟,而不是UI延迟。
在此之后,tableView跳转到单元格的确切位置。
是的,我也不太喜欢这个解决方案:|
编辑:
我这样做的唯一原因是通过调用cellForRowAtIndexPath:
来计算实际的行高度,但我发现,当通过委托方法estimatedHeightForRowAtIndexPath:
为每一行提供适当的estimatedHeight而不是将静态值提供给UITableView.estimatedRowHeight
时,就解决了这个问题。
我最后做的是将行的高度从willDisplayCell:forRowAtIndexPath:
缓存到磁盘,并在estimatedHeightForRowAtIndexPath:
上使用该值。
通过这样做,所有行的estimatedHeightForRowAtIndexPath:
都会在开始时被调用,并且scrollToRowAtIndexPath
可以很好地工作。
发布于 2015-06-12 21:56:44
这不是最好的解决方案,但我使用了一个变通方法来解决这个问题。始终将estimatedRowHeight更新为最高的计算单元格,然后使用类似以下内容:
CGPointZero:CGPointZero零动画:是;dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(0.2 * NSEC_PER_SEC)),dispatch_get_main_queue(),^{ [self.tableView scrollToRowAtIndexPath:NSIndexPath indexPathForRow:0 inSection:0 atScrollPosition:UITableViewScrollPositionTop animated:YES];});
因此,tableView应该会非常平滑地滚动到顶部。
https://stackoverflow.com/questions/20892661
复制相似问题