UITableView分页:在滚动奇怪的行为时插入新单元格

时间:2018-01-30 10:13:41

标签: ios swift uitableview pagination infinite-scroll

我有这个tableview,它在Debug委托方法到达最后一个单元格时加载新数据。问题是当用户向下滚动并调用此方法时,插入新单元格会使tableView向上滚动以显示新添加的单元格,并产生非常奇怪的动画。

现在,我可以简单地调用WillDisplayCell来避免这种情况,但这种方法会重新加载所有内容。我需要重新加载新的非可见单元格,因为我在tableView.reloadData()方法中为它们提供了自定义动画。

是否有任何关于实现动画单元格无缝WillDisplayCell分页的建议?

2 个答案:

答案 0 :(得分:0)

此解决方案适用于我,但它实际上取决于您的UI。可能在你的案例中有更多的东西:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if indexPath.row == data.count - 5 {
        let time = DispatchWallTime.now() + DispatchTimeInterval.seconds(1)
        DispatchQueue.main.asyncAfter(wallDeadline: time) {
            let indexes = 33...55
            self.data.append(contentsOf: indexes)
            let dataCount = self.data.count

            let paths:[IndexPath] = ((dataCount-indexes.count)...(dataCount-1)).flatMap({ index -> IndexPath in
                return IndexPath(row: index, section: 0)
            })
            self.tableView.insertRows(at: paths, with: .right)
        }
    }
}

在这里我正在嘲笑数据获取,但可能你必须实现保护以在数据仍在加载时阻止任何调用。

当我测试时,表视图中没有奇怪的滚动。

答案 1 :(得分:0)

我最近在尝试实现类似TikTok的滚动体验时遇到了这个问题。秘诀在于实施

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat

并返回单元格高度,即使tableview高度具有已知的固定数字

我不知道估计的单元格高度会影响行插入,但这似乎是毫无疑问的。

(这是我的经验,解决了iOS13 +应用程序的问题)