UICollectionView contentOffset错误

时间:2017-08-02 00:21:26

标签: ios objective-c uicollectionview

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

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

现在的问题是,更改过滤器后,滚动位置a.k.a. contentOffset保持不变。所以说集合视图将显示A类型的单元格,我会开始快速滚动,点击按钮,然后看到单元格更改为B类型但仍然保持滚动。如果用户能够记住它,则必须反复滚动回到他们的最后位置。

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

我遇到的问题是即使这似乎在某种程度上起作用,contentOffset属性似乎随机地偏离了一定数量的像素,有时它只是一个十几个左右,有时它只有半个屏幕值得。

这是我迄今为止所做的尝试:

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

但不幸的是,无论我尝试什么,我总会得到相同的结果。当返回到先前设置的过滤器时,它确实会变回先前捕获的偏移量,这几乎是我离开的位置,但并不完全。我老老实实地对待我的智慧'到此为止,还有人有任何建议吗?

ALSO ,如果重要的是,这一切都是使用AutoLayout设置的,并且过去曾经遇到过与香草UIScrollView和AutoLayout相关的一些不良体验。那么也许一些问题可能已经被遗传了?

1 个答案:

答案 0 :(得分:0)

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

collectionView.isScrollEnabled = false

然后启用它。

collectionView.isScrollEnabled = true