UICollectionView 动画可重用单元格?

Posted

技术标签:

【中文标题】UICollectionView 动画可重用单元格?【英文标题】:UICollectionView animating reusable cells? 【发布时间】:2013-08-09 09:16:02 【问题描述】:

我有一个UICollectionView,它被格式化为一个在屏幕上水平滚动的单行。它代表队列中的下一个条目,因此每当添加和删除项目时,它总是发生在索引 0(视图的最左侧),然后整个事物向前或向后移动一个空格。代码超级简单,就是:

[_collectionviewNextUp insertItemsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]];

[_collectionviewNextUp deleteItemsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]];

一切正常,除了insertItemsAtIndexPaths:deleteItemsAtIndexPaths: 的动画,特别是当 CollectionView 项目超出屏幕边缘时。只要队列中只有 6 个项目(一次可以看到的数量),它就可以完美地进行动画处理;但是 7 个或更多项目,动画变得很奇怪。删除一个项目(从左边),它还会动画一个被添加到右边的项目;添加一个项目(在左侧),它还会为从右侧删除的项目设置动画。即使队列有 50 个项目长,它总是会动画项目 #6(屏幕上最后一个可见的项目)消失和重新出现。没有错误或警告或任何东西,动画结束后,我在视图中留下了正确数量的项目,它只是为在屏幕边缘添加/删除的单元格设置动画。

我的理论是可重复使用的单元格正在被动画化。这听起来像是一件事吗?左右滚动效果很好,但插入和删除似乎只是成对动画,而且它们总是朝同一个方向“飞入”和“飞出”,就好像一个正在取代另一个位置。它看起来(在我没有经验的眼中)就像是最后的单元被飞过并添加到前面,或者前面的单元正在被移动到最后。

我已经尝试对此进行研究,但我只能找到引发错误和异常的动画问题,而我的却没有。有没有其他人经历过这个?任何人都可以提供一个修复,其中索引 0 项目得到动画,其余的只是平滑地滑入和滑出屏幕?

【问题讨论】:

【参考方案1】:

我假设您使用的是流式布局。流布局在layoutAttributesForElementsInRect: 边界(即项目移入和移出视图)上的动画项目非常有问题。根据我的经验,您可以通过覆盖“initialLayoutAttributesForAppearingItem”和finalLayoutAttributesForDisappearingItemAtIndexPath: 方法并在超类返回不正确的值时更正帧来解决其中的一些问题。这是对very similar issue 的成功答复。

我开源了一个简单的统一网格布局VCollectionViewGridLayout,它比UICollectionViewFlowLayout 提供的动画大大改进了动画。但是,它目前只进行垂直滚动。但是,如果您进入那里并转置所有水平和垂直计算,我相信它会解决您的问题。

【讨论】:

太棒了,谢谢!还有一个快速简单的问题:我需要子类化什么来覆盖这些方法?文档将它们作为UICollectionViewLayout 的一部分,但在我的项目中,我似乎只能找到UICollectionViewUICollectionViewCellUICollectionViewFlowLayout。 Layout 和 FlowLayout 是一回事吗?如果不是,我在哪里可以找到对象,以便将其指向我的新类? UICollectionViewLayout 是一个抽象基类。 'UICollectionViewFlowLayout` 是 Apple 提供的唯一一个具体实现。如果您还没有提供自己的布局类,那么您使用的是UICollectionViewFlowLayout。您可以通过设置集合视图的 collectionViewLayout 属性或通过 Interface Builder 中的属性检查器在代码中设置布局。

以上是关于UICollectionView 动画可重用单元格?的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 不重用单元格

制作 iOS Gallery - UICollectionView 可重用性

重用 UICollectionView 中的单元格时,会短暂显示重用 UICollectionViewCell 的旧内容

UICollectionView:使用动画和自定义布局调整单元格大小

UICollectionView 不重用单元格

重用单元格 UICollectionView - 某些单元格没有被选中