【问题标题】:collectionView inside tableView returns to first index on scrolltableView 内的 collectionView 在滚动时返回到第一个索引
【发布时间】:2019-11-24 22:31:27
【问题描述】:

我在 tableView 单元格内使用水平滚动 collectionView。我可以做所有的工作,但我遇到的是 collectionView 在 tableView 滚动时错过了自己滚动的 indexPath。考虑一下: 1. 我在一个单元格(单元格 A)的 collectionView 内滚动并移动到带有第 9 项和第 0 节的 indexPath。 2. 我滚动 tableView 并且单元格 A 离开屏幕。 3. 我向后滚动,单元格 A 将再次显示。 现在单元格 A 的集合已被重置,并且位于第 0 项和第 0 节的 indexPath 中。

我怎样才能解决这个问题以保留在第 9 项中?

【问题讨论】:

    标签: swift uitableview uicollectionview


    【解决方案1】:

    尝试在集合视图中使用以下内容:

    func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        collectionView.scrollToItem(at: indexPath, at: [.centeredHorizontally,.centeredVertically], animated: true)
    }
    

    【讨论】:

      【解决方案2】:

      有两种解决方法。

      1 - 重置 UICollectionView 偏移位置:

      要重置 collectionview 位置,只需在 cellForRowAtIndexPath 中调用 cell.collectionView.contentOffset = .zero

      2 - 保持之前的滚动位置:

      要保持之前的滚动位置,您需要在包含视图控制器的数据模型旁边存储每个单元格的偏移列表。然后,您可以将给定单元格的偏移量保存在 didEndDisplayingCell 中,并将其设置在 cellForRowAtIndexPath 而不是 .zero

      【讨论】:

        【解决方案3】:

        实际上它并没有回到零索引。它保持不变。 但是由于tableView重用了所有的collectionview,当它离开屏幕并返回并继承另一个collectionView的位置时,它被另一个cell替换了。

        因此,要解决此问题,请告诉 tableView 重用包含集合视图的单元格。为此,您必须为每个单元格设置不同的标识符。

        您还可以在didEndDisplayingCell... 上存储滚动位置并在willDisplayCell... 上恢复它。但是如果单元格是滚动动画的中间,它会立即停止。

        我建议您尝试两种方法并测试内存使用情况和性能,然后选择最适合您的方法。

        【讨论】:

        • 如果我说tableView不要重用cell,那么性能会有很大的变化,不是吗?
        • 如果您没有那么多单元格(例如超过 20 个),您不会看到明显的性能损失。
        • 我有分页。所以我认为可能超过 20
        • 细胞在离开屏幕时会释放一些内存,即使它们不重复使用。但是,如果您真的关心重用,可以尝试我的答案中的第二个选项。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-13
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多