【发布时间】:2017-08-02 00:21:25
【问题描述】:
我在普通的UIViewController 中设置了UICollectionView,该视图应该根据按钮切换的属性显示两种不同类型的数据/单元格。数据源始终保持不变,只是在每次点击按钮时重新填充。
每当触发按钮操作时,它都会清空并重新填充主数据源数组并在集合视图上调用-reloadData。这工作正常,没有意外的行为。
现在的问题是,滚动位置,也就是 contentOffset,在更改过滤器后保持不变。假设集合视图将显示A 类型的单元格,我将开始快速滚动,点击按钮,然后看到单元格更改为B 类型,但仍继续滚动。如果用户记得的话,他们将不得不反复滚动回到他们的最后一个位置。
我试图通过在我的视图控制器中使用 scrollPositions NSMutableDictionary 作为属性来解决这个问题。键代表过滤器类型(A 或B),值代表当前内容偏移的 y 坐标(这是一个垂直滚动的集合视图)。
我遇到的问题是,尽管这似乎在某种程度上有效,contentOffset 属性似乎随机偏离了一定数量的像素,有时只是十几个,有时是一半一个屏幕的价值。
这是我迄今为止尝试过的:
- 改为捕获
bounds - 调整
edgesForExtendedLayout - 将
automaticallyAdjustsScrollViewInsets设置为NO - 记住当前可见的索引路径,但这似乎有时也不正确
- 在捕获偏移量和恢复偏移量之前,在集合视图上调用
-invalidateLayout并在父视图上调用-layoutIfNeeded - 直接切换到
UIPageViewController并使用UIViewController包含每个不同过滤器的UICollectionView,但这会带来一大堆问题。
但不幸的是,无论我尝试什么,我总是得到相同的结果。当返回到之前设置的过滤器时,它确实变回了之前捕获的偏移量,这几乎是我离开的地方,但不完全是。老实说,我在这里不知所措,有人有更多建议吗?
ALSO,如果重要的话,这一切都是使用 AutoLayout 设置的,并且过去在 vanilla UIScrollViews 和 AutoLayout 方面有过一些不好的经历。那么也许有些问题可能是遗传的?
【问题讨论】:
标签: ios objective-c uicollectionview