如何为 UICollectionViewCell 的帧更改设置动画

How to animate a frame change of a UICollectionViewCell

我有一个带有自定义布局的 UICollectionView,它有 2 种不同的单元格大小(请参见下图的顶部)。

当我用

删除第一个单元格时
[myCollectionView deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]]];

我希望第二个单元格变小并取代第一个单元格。我还希望第三个单元格变大并取代第二个单元格。

幸运的是,布局似乎是自己做这些事情的,因为它会在删除一个单元格时重新加载单元格(所有单元格)的框架。

问题是帧刷新没有动画。唯一发生的动画是当单元格移动到它们各自的位置时。查看下面的结果(50% 速度)。

如何制作流畅的动画,在移动时将第二个和第三个单元格的大小调整为新大小?

我不是 100% 确定你想要什么,但如果你想为动画计时,请将其放入带有删除的动画块中。我认为这样的事情会奏效:

[myCollectionView performBatchUpdates:^{
   [myCollectionView deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]]];
   // do the size changes here (or whatever is not animating right)
} completion:nil];

好的,我找到了解决问题的方法。这是对我所经历的更好的解释。

问题

当我删除我的 collection 的第一项时,我的自定义 UICollectionViewLayoutprepareLayout 方法被调用,它正在重新计算我的单元格的框架。然后,layoutAttributesForElementsInRect 方法将所有这些新帧应用于单元格。因此它解释了为什么我的单元格会立即调整大小。

看来frame上的动画也不总是可以的。在这些情况下,我们必须使用 positionboundstransform 动画。

解决方案

就在动画发生之前,调用 finalizeCollectionViewUpdates 方法让我们调整它们。我尝试了几个小时更改边界动画,然后才终于明白正确的是 transform.scale。我在那里有更详细的解决方案:https://whosebug.com/a/35141936/1084822