如何为UICollectionViewCell

时间:2016-01-29 19:07:33

标签: objective-c animation uicollectionview uicollectionviewcell uicollectionviewlayout

我有一个自定义布局的UICollectionView有两种不同的单元格大小(参见下图的顶部)。 enter image description here

当我用

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

我希望第二个细胞变小,取代第一个细胞。我还希望第三个细胞变大,取代第二个细胞。

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

问题是帧没有动画就会立即刷新。发生的唯一动画是将单元格移动到各自的位置。请参阅下面的结果(50%速度)。

Instant frame change gif

如何在移动时将第二个和第三个单元格调整为新大小的平滑动画?

2 个答案:

答案 0 :(得分:0)

我不是100%确定你想要什么,但如果你想用动画计时,可以把它放在带有删除的动画块中。我觉得这样的事情会奏效:

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

答案 1 :(得分:0)

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

问题

当我删除我的收藏集的第一项时,我的自定义prepareLayout的{​​{1}}方法被调用,这会重新计算我的单元格的框架。然后,UICollectionViewLayout方法将所有这些新帧应用于单元格。因此,它解释了为什么我的细胞立即重新调整大小。

layoutAttributesForElementsInRect上的动画似乎并非总是可行。在这些情况下,我们必须使用framepositionbounds动画。

解决方案

在动画发生之前,调用transform方法让我们调整它们。我试图将边界动画更改几个小时,然后才最终理解正确的动画是finalizeCollectionViewUpdates。我在那里有一个更详细的解决方案:https://stackoverflow.com/a/35141936/1084822