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

Posted

技术标签:

【中文标题】如何为 UICollectionViewCell 的帧更改设置动画【英文标题】:How to animate a frame change of a UICollectionViewCell 【发布时间】:2016-01-29 19:07:32 【问题描述】:

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

当我删除第一个单元格时

[myCollectionView deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]]];

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

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

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

我怎样才能有一个流畅的动画,在第二个和第三个单元格移动时将它们调整为新的大小?

【问题讨论】:

【参考方案1】:

我不是 100% 确定你想要什么,但是如果你想用动画来计时,把它放在一个带有删除的动画块中。我认为这样的事情会起作用:

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

【讨论】:

使用这种技术,我可以动画颜色变化但不能调整大小,因为当我删除单元格时,我的 UICollectionViewLayoutprepareLayout 会被调用,它会设置集合中每个单元格的框架.因此,即使我更改了performBatchUpdates 中的框架,单元格的大小也会在没有动画的情况下调整。我希望我足够清楚:S 看看这个:objc.io/issues/12-animations/collectionview-animations——我想你需要继承UICollectionViewLayout 是的,我已经阅读了这篇文章,并且我已经继承了 UICollectionViewLayout 我现在尝试始终保持相同的帧大小(大的),并且只调整单元格内的容器大小,以便单元格仍然具有相同的帧大小。但是当我调整容器的大小时,即使我设置了它们的约束,它的子视图也不会调整大小。例如,图像视图对其父视图(即容器)有 4 个 0 的间距约束,但它保持与调整容器大小之前一样大。你知道为什么吗?【参考方案2】:

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

问题

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

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

解决方案

就在动画发生之前,调用finalizeCollectionViewUpdates 方法让我们调整它们。我试图改变边界动画好几个小时,最后才明白正确的是transform.scale。我有一个更详细的解决方案:https://***.com/a/35141936/1084822

【讨论】:

以上是关于如何为 UICollectionViewCell 的帧更改设置动画的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView多个单元格(UICollectionViewCell)在Objective-C中闪烁同步

UICollectionViewCell 子视图的位置错误(自动布局)

在UICollectionViewCell中,setRegion对MKMapView没有影响

如何在单元格对象中更改 UICollectionViewcell 大小形式的 IBAction

动画UICollectionViewCell时bounds.size和frame.size之间的相关性是啥

在我的应用程序中使用自定义 UICollectionViewCell 时如何停止内存警告