我正在开发一个小应用程序,其中包括信使功能。当显示聊天线程时,显然我使用了tableView
,用小气泡中的消息填充它,并在viewDidAppear
滚动到底部之前的某个时刻,因此显示最新的消息。
有一种流行的解决方案,可以使用tableView
或scrollToCellAtIndexPath
滚动到scrollRectToVisible
的底部。这些工作只需很少的数据和恒定的单元格高度。但在我的情况下,有很多消息数据,我使用UITableViewAutomaticDimensions
作为rowHeight
。这导致加载缓慢,而不是滚动到底部和疯狂的错误消息。
这就是为什么(IMO):要滚动到底部,tableView
必须加载所有单元格,因为它们具有自动尺寸,并且只有在知道它有多远之后才能向下滚动是。自动布局是另一个问题。有时它不会一直向下滚动,因为自动布局尚未完成,rowHeight
仍处于初始值。
我尝试了什么:将滚动放入didLayoutSubviews:
解决了问题,但加载速度非常慢,并且多次调用滚动(+一些疯狂的错误消息)
我想颠倒tableView
可以解决问题,因为第一个单元格可能是最新的消息,不需要滚动。
答案 0 :(得分:0)
为了优化,您应该使用以下方法:
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
它专为大型数据集而设计,因为它提供了计算的估计值而不是像素完美的单元格大小(您还必须提供获得高度的常规方法 - 显然)。
你可以做的第二个优化就是当你的单元格没有随时间改变高度时(也就是说,它们每次都有相同的高度),只是为每个NSIndexPath存储已计算的高度,然后使用这个值代替计算它再次。要使用AutoLayout获取单元格的高度,可以使用:
// Configure it
self.configureCell(cell!, indexPath: path)
// Update constraints
cell!.setNeedsUpdateConstraints()
cell!.updateConstraintsIfNeeded()
cell!.contentView.setNeedsLayout()
cell!.contentView.layoutIfNeeded()
// Calculate height of cell
let height : CGFloat = cell!.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height