ios - UITableView 在滚动/分页时没有正确处理 contentOffset

标签 ios uitableview uiscrollview

我有一个包含大量数据的表格 View 。 出于性能原因,它不能一次加载。 此外,有时需要加载数组的随机位置,因此增量分页不是一个好的选择。

当前针对这些要求的解决方案是在数据数组上滑动窗口。当用户滚动时,我从一端添加单元格并从另一端删除。我使用滚动位置(通过查看屏幕上显示的单元格)来确定是否该加载新数据了。

通常,当您调用 tableView.deleteRows(at:with:) 并从表的开头删除单元格时,tableView 会调整其 contentOffset 属性,以便用户仍然看到相同的内容细胞和手术前一样。

但是,当tableView在滚动后减速时,它的contentOffset并没有在更新时调整,这会导致一遍又一遍地加载新页面,直到减速完成。然后,在减速后的第一次更新时,contentOffset 由 tableView 固定并停止加载。

使用 tableView.insertRows(at:with:) 向后滚动并在表的开头添加值时会发生同样的事情。

如何让 UITableView 正确调整其 contentOffset?

或者是否有其他方法可以克服此错误——保持在数据数组中间加载任意部分并从中滚动的能力?

我做了一个小项目来说明这个错误:

https://github.com/wsb9/TableViewExample

最佳答案

从你的示例项目中,我可以理解你正在尝试通过窗口内容概念实现无限滚动,这样你就可以始终拥有固定数量的行(索引路径,比如说 100),这样当窗口向下/向上滚动时- TableView 相应地从顶部/底部删除 indexPaths。 即使你有更多的数据源项目,你总是可以拥有 indexPaths 100 的 tableView

基本上你在这里处理两个问题:

  1. 内容偏移量

  2. 动态高度

假设我们的高度是固定的 (44) 并且表格没有倒置。 要实现无限滚动的窗口,您必须执行以下操作:

override func scrollViewDidScroll(_ scrollView: UIScrollView) {

        let bottom: CGFloat = scrollView.contentSize.height - scrollView.frame.size.height
        let buffer: CGFloat = 3 * 44
        let scrollPosition = scrollView.contentOffset.y

        if (scrollPosition > bottom - buffer) {
            dataSource.expose(dataSource.exposedRange.shift(by: 25))
            self.tableView.contentOffset.y -= self.dataSource.deltaHeightToRemove
        }
    }
  • 决定向下滚动时需要保留多少高度缓冲区。此高度缓冲区是您决定向数据源中插入更多项目 (25) 之后的高度。
  • 此时你必须从顶部移除项目
  • 当您从顶部移除项目时,您基本上是在告诉 scrollView 将其内容偏移量减少相同的高度。
  • 这样总的内容大小每次都会固定

    希望对您有所帮助。

    编辑:- 这是修改后的代码,它实际上在底部进行无限滚动 具有动态单元格高度的表格 View 。这不会增加行数超过 100。但仍会在滑动窗口中加载数据。 link

关于ios - UITableView 在滚动/分页时没有正确处理 contentOffset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46286376/

相关文章:

ios - 在 subview Controller 之间切换

ios - SwiftUI 无法绑定(bind)注入(inject)的值

ios - UITableView subview 不包含 UITableViewWrapperView iOS 11

ios - 如何使用自动布局设置 ScrollView 内容大小?

cocoa-touch - 如何防止在 UIScrollView 中手动缩放

ios - 一个 SwiftUI View 中的多个垂直 ScrollView

ios - swift 从导航 Controller 中解雇后如何呈现另一个 View Controller ?

iOS - UIWebview 在滚动时部分消失

ios - 加载 alamofire json 到 tableview swift

带有 2 种不同 View 的 iOS 拖放