我想做的是更改 UICollectionViewCell 的大小,并在选择单元格时为该更改设置动画。我已经通过在 collectionView: didSelectItemAtIndexPath:
中将一个单元格标记为已选中,然后在我的 UICollectionView 上调用 reloadData
,以不同的大小显示选定的单元格,成功地做到了这一点。
然而,这一切都发生了,我不知道如何让尺寸变化动画化。有什么想法吗?
我已经找到了Animate uicollectionview cells on selection ,但答案对我来说并不具体,我还没有弄清楚它是否也能帮助我。
最佳答案
在 Chase Roberts 的帮助下,我现在找到了解决问题的方法。我的代码基本上是这样的:
// Prepare for animation
[self.collectionView.collectionViewLayout invalidateLayout];
UICollectionViewCell *__weak cell = [self.collectionView cellForItemAtIndexPath:indexPath]; // Avoid retain cycles
void (^animateChangeWidth)() = ^()
{
CGRect frame = cell.frame;
frame.size = cell.intrinsicContentSize;
cell.frame = frame;
};
// Animate
[UIView transitionWithView:cellToChangeSize duration:0.1f options: UIViewAnimationOptionCurveLinear animations:animateChangeWidth completion:nil];
进一步解释:
最重要的步骤之一是对您正在使用的
UICollectionView.collectionViewLayout
调用invalidateLayout
。如果您忘记了它,细胞很可能会超出您的集合边界 - 这是您很可能不希望发生的事情。还要考虑您的代码应该在某个时候将单元格的新大小呈现给您的布局。在我的例子中(我使用的是UICollectionViewFlowLayout
),我调整了collectionView:layout:sizeForItemAtIndexPath
方法以反射(reflect)修改后的单元格的新大小。忘记那部分,如果您先调用invalidateLayout
然后尝试对大小的变化进行动画处理,那么您的单元格大小根本不会发生任何变化。最奇怪(至少对我而言)但重要的是您在动画 block 内调用
invalidateLayout
不是。如果这样做,动画将不会显示流畅,而是会出现故障和闪烁。您必须调用
UIView
的transitionWithView:duration:options:animations:completion:
方法,并将单元格作为transitionWithView
的参数>,而不是整个 Collection View ,因为它是您想要动画的单元格,而不是整个集合。我使用单元格的
intrinsicContentSize
方法返回我想要的大小 - 在我的例子中,我增加和缩小单元格的宽度以显示或隐藏按钮,取决于单元格的选择状态。
我希望这会帮助一些人。对我来说,弄清楚如何使该动画正常工作需要几个小时,所以我试图让其他人摆脱这种耗时的负担。
关于ios - UICollectionView:选择时动画单元格大小变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13780153/