我在普通UICollectionView
内设置了UIViewController
,视图应该根据按钮切换的属性显示两种不同类型的数据/单元格。数据源始终保持不变,只需在每个按钮上重新填充。
每当触发按钮操作时,它会清空并重新填充主数据源数组,并在集合视图上调用-reloadData
。这很好,并且没有意外的行为。
现在的问题是,更改过滤器后,滚动位置a.k.a. contentOffset
保持不变。所以说集合视图将显示A
类型的单元格,我会开始快速滚动,点击按钮,然后看到单元格更改为B
类型但仍然保持滚动。如果用户能够记住它,则必须反复滚动回到他们的最后位置。
我试图通过在我的视图控制器中将scrollPositions
NSMutableDictionary
作为属性来解决此问题。键表示过滤器类型(A
或B
),值表示当前内容偏移的y坐标(这是垂直滚动的集合视图)。
我遇到的问题是即使这似乎在某种程度上起作用,contentOffset
属性似乎随机地偏离了一定数量的像素,有时它只是一个十几个左右,有时它只有半个屏幕值得。
这是我迄今为止所做的尝试:
bounds
edgesForExtendedLayout
automaticallyAdjustsScrollViewInsets
设为NO
-invalidateLayout
并在父视图上调用-layoutIfNeeded
UIPageViewController
并且UIViewController
包含UICollectionView
,但这会带来另外一系列问题。但不幸的是,无论我尝试什么,我总会得到相同的结果。当返回到先前设置的过滤器时,它确实会变回先前捕获的偏移量,这几乎是我离开的位置,但并不完全。我老老实实地对待我的智慧'到此为止,还有人有任何建议吗?
ALSO ,如果重要的是,这一切都是使用AutoLayout设置的,并且过去曾经遇到过与香草UIScrollView
和AutoLayout相关的一些不良体验。那么也许一些问题可能已经被遗传了?
答案 0 :(得分:0)
使用NSMutableDictionary
的解决方案应该可以正常工作,只需记住在更改过滤器时停止滚动,这样您就可以在偏移量上获得最高精度。要停止当前滚动:
collectionView.isScrollEnabled = false
然后启用它。
collectionView.isScrollEnabled = true