UICollectionView:在选择时动画改变单元大小
我想要做的是更改UICollectionViewCell的大小,并在选中单元格时为该更改设置动画。 我已经设法通过在cellView collectionView: didSelectItemAtIndexPath:
选择一个单元格作为unanimated,然后在我的UICollectionView上调用reloadData
,显示具有不同大小的选定单元格。
尽管如此,这一切都是同时发生的,我不知道如何让动画变化。 有任何想法吗?
我已经在选择中找到了Animate uicollectionview单元格,但答案是对于我而言并不具体,我还没弄清楚它是否也可以帮助我。
[UIView transitionWithView:collectionView
duration:.5
options:UIViewAnimationOptionTransitionCurlUp
animations:^{
//any animatable attribute here.
cell.frame = CGRectMake(3, 14, 100, 100);
} completion:^(BOOL finished) {
//whatever you want to do upon completion
}];
在didselectItemAtIndexPath方法中沿着这些线沿着东西玩耍。
在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
方法以反映修改过的单元格的新大小。 忘记这部分,如果您首先调用invalidateLayout
,然后尝试对大小的变化进行动画处理,则根本不会出现任何细胞大小。
最奇怪的是(至少对我来说),但重要的是你不在动画块内调用invalidateLayout
。 如果这样做,动画将不会显示平滑但闪烁不定。
您必须调用UIView
的transitionWithView:duration:options:animations:completion:
方法,将cell作为transitionWithView
参数,而不是整个集合视图,因为它是要获取动画的单元格,而不是整个集合。
我使用了我的单元格的intrinsicContentSize
方法来返回我想要的大小 - 在我的情况下,我根据单元格的选择状态增长和缩小单元格的宽度,以显示按钮或隐藏它。
我希望这会帮助一些人。 对我来说,花了几个小时才能弄清楚如何使动画正常工作,所以我试图让其他人摆脱那种耗时的负担。
对单元格的大小进行动画处理对于集合视图的工作方式与对表视图的工作方式相同。 如果您想为单元格的大小设置动画,请创建一个反映单元格状态的数据模型(在我的情况下,我只使用一个标志(CollectionViewCellExpanded,CollectionViewCellCollapsed)并相应地返回CGSize。
当您调用并清空performBathUpdates调用时,该视图会自动生成动画。
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
[collectionView performBatchUpdates:^{
// append your data model to return a larger size for
// cell at this index path
} completion:^(BOOL finished) {
}];
}
链接地址: http://www.djcxy.com/p/84157.html
上一篇: UICollectionView: Animate cell size change on selection
下一篇: How do you determine spacing between cells in UICollectionView flowLayout