0

我有一个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 项目得到动画,其余的只是平滑地滑入和滑出屏幕?

4

1 回答 1

1

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

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

于 2013-08-09T21:06:26.653 回答