如何为 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];
【讨论】:
使用这种技术,我可以动画颜色变化但不能调整大小,因为当我删除单元格时,我的UICollectionViewLayout
的 prepareLayout
会被调用,它会设置集合中每个单元格的框架.因此,即使我更改了performBatchUpdates
中的框架,单元格的大小也会在没有动画的情况下调整。我希望我足够清楚:S
看看这个:objc.io/issues/12-animations/collectionview-animations——我想你需要继承UICollectionViewLayout
是的,我已经阅读了这篇文章,并且我已经继承了 UICollectionViewLayout
我现在尝试始终保持相同的帧大小(大的),并且只调整单元格内的容器大小,以便单元格仍然具有相同的帧大小。但是当我调整容器的大小时,即使我设置了它们的约束,它的子视图也不会调整大小。例如,图像视图对其父视图(即容器)有 4 个 0 的间距约束,但它保持与调整容器大小之前一样大。你知道为什么吗?【参考方案2】:
好的,我找到了解决问题的方法。这是对我所经历的事情的更好解释。
问题
当我删除我收藏的第一项时,我的自定义UICollectionViewLayout
的prepareLayout
方法被调用,它正在重新计算我的单元格的框架。然后,layoutAttributesForElementsInRect
方法将所有这些新帧应用于单元格。因此,它解释了为什么我的单元格会立即调整大小。
frame
上的动画似乎并不总是可行的。在这些情况下,我们必须使用position
、bounds
和transform
动画。
解决方案
就在动画发生之前,调用finalizeCollectionViewUpdates
方法让我们调整它们。我试图改变边界动画好几个小时,最后才明白正确的是transform.scale
。我有一个更详细的解决方案:https://***.com/a/35141936/1084822
【讨论】:
以上是关于如何为 UICollectionViewCell 的帧更改设置动画的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView多个单元格(UICollectionViewCell)在Objective-C中闪烁同步
UICollectionViewCell 子视图的位置错误(自动布局)
在UICollectionViewCell中,setRegion对MKMapView没有影响
如何在单元格对象中更改 UICollectionViewcell 大小形式的 IBAction