【问题标题】:Prevent UICollectionView to scroll while inserting items on top防止 UICollectionView 在顶部插入项目时滚动
【发布时间】:2016-06-23 07:35:38
【问题描述】:

在我的 iOS 应用程序中,我有一个 UICollectionView,它可以从服务器动态更新其内容。假设 UIollectionView 中有 10 个单元格(索引 0-9),当我下载其他 10 个对象时,我将它们插入索引(0-9),将旧项目移动到索引(10-19)。

我的目标是使 UICollectionView 动画无效,因此,如果我在顶部位置的索引 3 处有元素,当我添加其他 10 个项目时,它们将被添加为顶部项目,但我再次看到之前显示的相同项目(即更新后将位于索引 13)。

我尝试将 UICollectionView 项插入到 UIView.performWithoutAnimation 方法中或使用以下代码:

UIView.setAnimationsEnabled(false)

// insert items in collection view using perform batch updates

UIView.setAnimationsEnabled(true)

但结果仍然不好,当我在顶部范围添加项目时,我的 UICollectionView 仍然“随机”滚动。

【问题讨论】:

    标签: ios uicollectionview


    【解决方案1】:

    简单地修改你的数据数组并在你的collectionView上使用.reloadData怎么样?

    它会重新加载它不应该做任何滚动。这意味着,如果您位于 30 元素滚动视图的底部,它将停留在底部。

    但是你可以在之后调用它,它会强制滚动到顶部,有或没有动画:

    collectionview.SetContentOffset(CGPoint.Zero, false);

    上面这行是凭记忆写的,可能拼写错误。基本上,使用方法而不是属性设置内容偏移量 0,0,并使用第二个参数来移除动画。

    【讨论】:

    • 我已经尝试过您链接中提供的解决方案,但没有成功。我使用 performBatchUpdates,我不应该使用它吗?
    • 其实你可以换一种方式;看看我编辑的答案。在您的场景中使用 .reloadData 可以吗?
    • 我尝试过使用重新加载数据,但它还是会滚动。我也不想使用它,因为我只想重新加载插入的项目并保持滚动位置。我认为我必须让它以编程方式滚动到记住的位置+(项目添加的总高度)
    【解决方案2】:

    我没有尝试,但这里有一个您可以尝试的列表:

    • 在更新之前设置self.collectionView.scrollEnabled = false,在更新之后设置self.collectionView.scrollEnabled = true
    • 不确定,但您可以尝试设置self.collectionView.scrollsToTop = false
    • 将 scrollView 的当前位置保存在 CGPoint 中,然后在您的更新调用之后立即 self.collectionView.setContentOffset(previousPosition, animated: false)

    希望这会有所帮助。

    【讨论】:

    • 第三种方法似乎不错。我以不同的方式实现了它。我记得我上次的内容偏移量,然后我添加了所有项目,然后我将内容偏移量设置为 rememberedContentOffset + addedItemsTotalHeight。它有效,插入后我仍在查看记住的单元格,但视觉效果非常糟糕。如果我禁用了所有动画,它会在插入过程中向上滚动,然后向下滚动
    • 您找到了避免这种副作用的解决方案吗?
    • 动画并不是很完美,但我已经实现了一些逻辑来让它运作良好。例如将每个单元格高度保存在数组中以及其他性能改进。
    猜你喜欢
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    相关资源
    最近更新 更多