UICollectionView contentOffset 错误

Posted

技术标签:

【中文标题】UICollectionView contentOffset 错误【英文标题】:UICollectionView contentOffset wrong 【发布时间】:2017-08-02 00:21:25 【问题描述】:

我在普通的UIViewController 中设置了UICollectionView,该视图应该根据按钮切换的属性显示两种不同类型的数据/单元格。数据源始终保持不变,只是在每次点击按钮时重新填充。

每当触发按钮操作时,它都会清空并重新填充主数据源数组并在集合视图上调用-reloadData。这工作正常,没有意外的行为。

现在的问题是,滚动位置,也就是 contentOffset,在更改过滤器后保持不变。假设集合视图将显示A 类型的单元格,我将开始快速滚动,点击按钮,然后看到单元格更改为B 类型,但仍继续滚动。如果用户记得的话,他们将不得不反复滚动回到他们的最后一个位置。

我试图通过在我的视图控制器中使用 scrollPositions NSMutableDictionary 作为属性来解决这个问题。键代表过滤器类型(AB),值代表当前内容偏移的 y 坐标(这是一个垂直滚动的集合视图)。

我遇到的问题是,尽管这似乎在某种程度上有效,contentOffset 属性似乎随机偏离了一定数量的像素,有时只是十几个,有时是一半一个屏幕的价值。

这是我迄今为止尝试过的:

改为捕获bounds 调整edgesForExtendedLayoutautomaticallyAdjustsScrollViewInsets 设置为NO 记住当前可见的索引路径,但这似乎有时也不正确 在捕获偏移量和恢复偏移量之前,在集合视图上调用 -invalidateLayout 并在父视图上调用 -layoutIfNeeded 直接切换到UIPageViewController 并使用UIViewController 包含每个不同过滤器的UICollectionView,但这会带来一大堆问题。

但不幸的是,无论我尝试什么,我总是得到相同的结果。当返回到之前设置的过滤器时,它确实变回了之前捕获的偏移量,这几乎是我离开的地方,但不完全是。老实说,我在这里不知所措,有人有更多建议吗?

ALSO,如果重要的话,这一切都是使用 AutoLayout 设置的,并且过去在 vanilla UIScrollViews 和 AutoLayout 方面有过一些不好的经历。那么也许有些问题可能是遗传的?

【问题讨论】:

【参考方案1】:

您使用NSMutableDictionary 的解决方案应该可以工作,只需记住在更改过滤器时停止滚动,这样您就可以获得尽可能高的偏移精度。停止当前滚动:

collectionView.isScrollEnabled = false

然后重新启用它。

collectionView.isScrollEnabled = true

【讨论】:

感谢您的回答。我应该指定我也尝试过禁用滚动。在更改过滤器之前还要等待几秒钟,希望集合视图可以在内部解析其逻辑并更新其偏移属性。我提出的用户在滚动时切换标签的场景不是这个问题的症结所在。相反,contentOffset 属性的不准确性。

以上是关于UICollectionView contentOffset 错误的主要内容,如果未能解决你的问题,请参考以下文章

React 原生绑定动画事件

在 iOS7 中设置 NSLayoutConstraint 常量

折叠UICollectionView

-[UICollectionView _endItemAnimations] 中的 UICollectionView 断言失败

如何滚动另一个 UICollectionView 下方的 UICollectionView?

UICollectionView 单元内部已加载,但 UICollectionView 未显示