UITableViewController滚动优化“Messenger App”类函数

时间:2015-07-22 13:46:58

标签: ios swift uitableview

我正在开发一个小应用程序,其中包括信使功能。当显示聊天线程时,显然我使用了tableView,用小气泡中的消息填充它,并在viewDidAppear滚动到底部之前的某个时刻,因此显示最新的消息。

有一种流行的解决方案,可以使用tableViewscrollToCellAtIndexPath滚动到scrollRectToVisible的底部。这些工作只需很少的数据和恒定的单元格高度。但在我的情况下,有很多消息数据,我使用UITableViewAutomaticDimensions作为rowHeight。这导致加载缓慢,而不是滚动到底部和疯狂的错误消息。

这就是为什么(IMO):要滚动到底部,tableView必须加载所有单元格,因为它们具有自动尺寸,并且只有在知道它有多远之后才能向下滚动是。自动布局是另一个问题。有时它不会一直向下滚动,因为自动布局尚未完成,rowHeight仍处于初始值。

我尝试了什么:将滚动放入didLayoutSubviews:解决了问题,但加载速度非常慢,并且多次调用滚动(+一些疯狂的错误消息)

我想颠倒tableView可以解决问题,因为第一个单元格可能是最新的消息,不需要滚动。

1 个答案:

答案 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