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


//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)

上面的解决方案对我不起作用

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

解决方案将是替换:

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

与此:

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

这个想法是通过相对在新位置的高度差向表移动表 - 因此,它应该在表视图重新加载后都会发生,并且将其重新放置为由Uikit计算的自动contentOffset。

我认为您不需要这些行才能实现想要的东西:

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

确认我的计算修复程序后,请尝试删除它们

虽然UITableViewUIScrollView的子视图,但有更好的方法可以在表视图中编程滚动。您可以使用scrollToRow函数;可以使用numberOfSectionsnumberOfRows

找到"最后"索引路径

最新更新