如何UITableView
在最顶部插入行而不会导致其余单元格被按下 - 因此滚动位置似乎根本没有变化?
就像Facebook和Twitter在发送新帖子时一样,它们被插入顶部,但滚动位置保持不变.
我的问题类似于这个问题.是什么让我的问题与这个问题的独特之处在于我没有使用具有固定行高的表 - 我正在使用UITableViewAutomaticDimension
和一个estimatedRowHeight
.因此,建议的答案将无法工作,因为我无法确定行高.
我已经尝试过这个不涉及行高度的解决方案,但contentSize
重新加载后仍然不正确,因为该contentOffset
集合的相对位置不同 - 单元格仍然被推到插入之前的位置.这是因为单元格尚未在屏幕上呈现,因此iOS无需为它计算适当的高度,直到它即将出现,因此contentSize
不准确.
CGSize beforeContentSize = tableView.contentSize; [tableView reloadData]; CGSize afterContentSize = tableView.contentSize; CGPoint afterContentOffset = tableView.contentOffset; tableView.contentOffset = CGPointMake(afterContentOffset.x, afterContentOffset.y + afterContentSize.height - beforeContentSize.height);
阿兰指出rectForCellAtIndexPath
哪个力量iOS要计算合适的高度.我现在可以确定插入单元格的正确高度,但是滚动视图contentSize
仍然不正确,正如我遍历所有单元格并加起来大于高度的高度所证明的那样contentSize.height
.因此,当我contentOffset
手动设置时,它不会滚动到正确的位置.
原始代码:
//update data source [tableView beginUpdates]; [tableView insertRowsAtIndexPaths:newIndexPaths withRowAnimation:UITableViewRowAnimationAutomatic]; [tableView endUpdates];
在这种情况下,可以做些什么来实现所需的行为?
晚到派对,但即使单元格具有动态高度(又名UITableViewAutomaticDimension
),也不需要迭代单元格来计算它们的大小,但只有在tableView的最开头添加项目并且没有标题时才有效,一点点数学,它可能适应每种情况:
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { if indexPath.row == 0 { self.getMoreMessages() } } private func getMoreMessages(){ var initialOffset = self.tableView.contentOffset.y self.tableView.reloadData() //@numberOfCellsAdded: number of items added at top of the table self.tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: numberOfCellsAdded, inSection: 0), atScrollPosition: .Top, animated: false) self.tableView.contentOffset.y += initialOffset }