我有一个自定义布局的UICollectionView有两种不同的单元格大小(参见下图的顶部)。
当我用
删除第一个单元格时[myCollectionView deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]]];
我希望第二个细胞变小,取代第一个细胞。我还希望第三个细胞变大,取代第二个细胞。
幸运的是,布局似乎是自己做这些事情,因为当一个被删除时,它会重新加载单元格的框架(所有这些框架)。
问题是帧没有动画就会立即刷新。发生的唯一动画是将单元格移动到各自的位置。请参阅下面的结果(50%速度)。
如何在移动时将第二个和第三个单元格调整为新大小的平滑动画?
答案 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
上的动画似乎并非总是可行。在这些情况下,我们必须使用frame
,position
和bounds
动画。
在动画发生之前,调用transform
方法让我们调整它们。我试图将边界动画更改几个小时,然后才最终理解正确的动画是finalizeCollectionViewUpdates
。我在那里有一个更详细的解决方案:https://stackoverflow.com/a/35141936/1084822