无法将TableView平滑地设置为插入底部的新单元格

时间:2015-08-18 19:39:16

标签: ios swift uitableview core-data uiscrollview

我有一个Swift应用程序,它每隔几秒就生成一次信息并将其添加到ManagedObjectContext。

我有一个tableview,它实现了NSFetchedResultsControllerDelegate协议,在屏幕上显示新值。

值总是一个接一个地出现,它们总是插在表格的底部。

细胞大小可变。

我需要的是保持滚动顺畅到新插入的单元格,就像在消息传递应用程序中一样。

我有以下代码:

func controllerWillChangeContent(controller: NSFetchedResultsController) {
    self.tableView!.beginUpdates()
}

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
    self.tableView!.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .None)
    self.insertedIndexPath = newIndexPath
}

func controllerDidChangeContent(controller: NSFetchedResultsController) {
    self.tableView!.endUpdates()
    self.tableView!.scrollToRowAtIndexPath(self.insertedIndexPath!, atScrollPosition: .None, animated: animated)
}

代码工作正常,但当表格中有很多行时,滚动的动画会在插入的每个新行中上下跳动。

是否有人知道如何让这个动画顺利运行到新行?

谢谢,

GA

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。问题是我正在使用自动调整大小。

self.tableView!.rowHeight = UITableViewAutomaticDimension
self.tableView!.estimatedRowHeight = 150

我的表格单元格的大小可能非常不同,自动调整大小总是开始将单元格调整为估计值。在添加新单元格之前,表格自动滚动到基于估计计算的位置。由于平均大小可能如此变化,因此滚动表格的估计位置总是错误的,这会像疯狂一样上下移动滚动。 为了解决这个问题,我设置了方法:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat

我在设置视图内容之前就计算了大小。通过这种方式,表格根据单元格的实际大小计算滚动。 我希望它有所帮助。 GA