插入新行时,UITableView更改位置

时间:2019-06-22 05:50:38

标签: ios swift uitableview

我有一个UITableView,实现了一种“无限滚动”。

这是通过计算新数据的IndexPath然后传递到tableView.insertRows(at: indexPaths, with: .none)来完成的。

我的数据从50页的api返回。但是,我看到的是,当用户非常快速地滚动到底部时,表将插入行,然后跳到更远的部分,基本上失去了位置。

enter image description here

我的表格是使用此代码段创建的

  private func addTableView() {
        tableView = UITableView(frame: .zero)
        tableView.showsVerticalScrollIndicator = false
        tableView.showsHorizontalScrollIndicator = false
        tableView.rowHeight = UITableView.automaticDimension
        tableView.bounces = true
        tableView.estimatedRowHeight = 200
        tableView.separatorStyle = .none
        tableView.isHidden = true
        tableView.backgroundColor = .clear
        tableView.tableFooterView = UIView()

        addSubview(tableView)
        tableView.position(top: topAnchor, leading: leadingAnchor, bottom: bottomAnchor, trailing: trailingAnchor)

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: UITableViewCell.reuseID)
    }

然后使用

触发重新加载
  func insertRows(_ indexPaths: [IndexPath]) {
        UIView.performWithoutAnimation {
            tableView.insertRows(at: indexPaths, with: .none)
            self.tableView.isHidden = false
        }
    }

我使用performWithoutAnimation是因为我不喜欢任何用于插入行的动画。

在我的视图模型中,我注入符合FeedTableViewProvider的{​​{1}}并具有以下方法

UITableViewDataSource, UITableViewDelegate

3 个答案:

答案 0 :(得分:1)

我怀疑这实际上与使用

有关
tableView.rowHeight = UITableView.automaticDimension
....
tableView.estimatedRowHeight = 200

当插入新单元格时,位置随着偏移量的变化而变化。

我将从保留包含您的细胞高度的某种缓存开始

private var sizeCache: [IndexPath: CGFloat] = [IndexPath: CGFloat]()

然后您可以在单元格滚动到屏幕之外时捕获它

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    sizeCache[indexPath] = cell.frame.size.height
}

现在请确保从缓存中应用该大小

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return sizeCache[indexPath] ?? UITableView.automaticDimension
}

现在,当插入单元格并且它们以新的偏移量跳转时,它们应该以正确的高度进行渲染,这意味着视图应该基本上保持在原位。

答案 1 :(得分:0)

在将新数据添加到tableview时使用此代码。

  UIView.setAnimationsEnabled(false)
    self.tableView.beginUpdates()
    self.tableView.reloadSections(NSIndexSet(index: 0) as IndexSet, with: UITableViewRowAnimation.none)
    self.tableView.endUpdates()

答案 2 :(得分:-1)

您可以在Tableview中的每个新行数据插入上使用此功能,以防止滚动到底部。

Edittext val;

inside button.setOnClickListener(){

      val.settext(null);
}