UICollectionView contentOffset 错误
Posted
技术标签:
【中文标题】UICollectionView contentOffset 错误【英文标题】:UICollectionView contentOffset wrong 【发布时间】: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 UIScrollView
s 和 AutoLayout 方面有过一些不好的经历。那么也许有些问题可能是遗传的?
【问题讨论】:
【参考方案1】:您使用NSMutableDictionary
的解决方案应该可以工作,只需记住在更改过滤器时停止滚动,这样您就可以获得尽可能高的偏移精度。停止当前滚动:
collectionView.isScrollEnabled = false
然后重新启用它。
collectionView.isScrollEnabled = true
【讨论】:
感谢您的回答。我应该指定我也尝试过禁用滚动。在更改过滤器之前还要等待几秒钟,希望集合视图可以在内部解析其逻辑并更新其偏移属性。我提出的用户在滚动时切换标签的场景不是这个问题的症结所在。相反,contentOffset
属性的不准确性。以上是关于UICollectionView contentOffset 错误的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS7 中设置 NSLayoutConstraint 常量
-[UICollectionView _endItemAnimations] 中的 UICollectionView 断言失败