如何为 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 的第一项时,我的自定义 UICollectionViewLayout
的 prepareLayout
方法被调用,它正在重新计算我的单元格的框架。然后,layoutAttributesForElementsInRect
方法将所有这些新帧应用于单元格。因此它解释了为什么我的单元格会立即调整大小。
看来frame
上的动画也不总是可以的。在这些情况下,我们必须使用 position
、bounds
和 transform
动画。
解决方案
就在动画发生之前,调用 finalizeCollectionViewUpdates
方法让我们调整它们。我尝试了几个小时更改边界动画,然后才终于明白正确的是 transform.scale
。我在那里有更详细的解决方案:https://whosebug.com/a/35141936/1084822
我有一个带有自定义布局的 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 的第一项时,我的自定义 UICollectionViewLayout
的 prepareLayout
方法被调用,它正在重新计算我的单元格的框架。然后,layoutAttributesForElementsInRect
方法将所有这些新帧应用于单元格。因此它解释了为什么我的单元格会立即调整大小。
看来frame
上的动画也不总是可以的。在这些情况下,我们必须使用 position
、bounds
和 transform
动画。
解决方案
就在动画发生之前,调用 finalizeCollectionViewUpdates
方法让我们调整它们。我尝试了几个小时更改边界动画,然后才终于明白正确的是 transform.scale
。我在那里有更详细的解决方案:https://whosebug.com/a/35141936/1084822