如何在顶部插入项目后将UITableView滚动到上一个contentOffset

时间:2016-12-29 17:57:37

标签: ios iphone swift uitableview

//Old table view height                
let oldHeight: CGFloat = self.tableView.contentSize.height

// Update table with indexpath array
UIView.setAnimationsEnabled(false)
self.tableView.insertRows(at: (indexPath as NSArray) as! [IndexPath], with: UITableViewRowAnimation.none)
UIView.setAnimationsEnabled(true)

//Layout table view if needed
self.tableView.layoutIfNeeded()

//New content offset
let newHeight: CGFloat = self.tableView.contentSize.height

//Set content offset
let adjustablePoint: CGPoint = CGPoint(x: 0, y: newHeight - oldHeight)

//Set
self.tableView.setContentOffset(adjustablePoint, animated: false)

以上解决方案对我不起作用

2 个答案:

答案 0 :(得分:0)

虽然UITableViewUIScrollView的子视图,但是在表格视图中以编程方式滚动的更好方法。您可以使用scrollToRow功能;最后的'可以使用numberOfSectionsnumberOfRows找到索引路径。

答案 1 :(得分:0)

您在计算中缺少一个重要的值 - 当前" y"重新加载后的偏移量。您将偏移设置为新高度和旧高度之间的差异 - 这可能会在某处滚动到顶部。

解决方案是替换它:

let adjustablePoint: CGPoint = CGPoint(x: 0, y: newHeight - oldHeight

用这个:

let adjustablePoint: CGPoint = CGPoint(x: 0, y: self.tableView.contentOffset.y + newHeight - oldHeight)

这个想法是通过相对于新位置的高度差来移动表格 - 所以它应该在重新加载表格视图之后发生,并且它被重新定位到由UIKit计算的自动内容偏移量。

我认为你不需要这些线来达到你想要的效果:

UIView.setAnimationsEnabled(false)
...
UIView.setAnimationsEnabled(true)
...
self.chatTableView.layoutIfNeeded()

确认我的计算修正工作正常后,请尝试删除它们