Iphone UICollectionView动画(插入/删除项目)

Iphone UICollectionView动画(插入/删除项目),iphone,ios,objective-c,uicollectionview,uicollectionviewcell,Iphone,Ios,Objective C,Uicollectionview,Uicollectionviewcell,我希望在插入和/或删除UICollectionViewCell时自定义动画样式 我需要这样做的原因是,默认情况下,我看到插入单元会使动画平滑淡入,而删除单元则会使动画向左移动+淡出。如果不是因为一个问题,我会非常高兴的 删除单元格后,在添加新单元格时仍会重复使用该单元格,而在重复使用该单元格时,不会使用默认的淡入效果,而是向左移动+淡入的组合 我不知道为什么我会在动画中出现这种不一致。如果这是一个已知的错误/问题/愚蠢(在我这边:),请让我知道如何修复它 否则,请让我知道如何在删除单元格时设置自

我希望在插入和/或删除UICollectionViewCell时自定义动画样式

我需要这样做的原因是,默认情况下,我看到插入单元会使动画平滑淡入,而删除单元则会使动画向左移动+淡出。如果不是因为一个问题,我会非常高兴的

删除单元格后,在添加新单元格时仍会重复使用该单元格,而在重复使用该单元格时,不会使用默认的淡入效果,而是向左移动+淡入的组合

我不知道为什么我会在动画中出现这种不一致。如果这是一个已知的错误/问题/愚蠢(在我这边:),请让我知道如何修复它

否则,请让我知道如何在删除单元格时设置自定义动画(或将我指向教程)

谢谢

更新

通过子类化UICollectionViewFlowLayout并添加这行代码,修复了奇怪的动画行为

- (UICollectionViewLayoutAttributes *) initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath {

      return nil;
}

就这样!:)

如果使用自己的
UICollectionViewLayout
子类,则可以实现以下方法:

  • InitialLayoutAttribute for AppearinGiteMatIndex路径:
    用于插入

  • FinallYoutAttributesForDisappearinGiteMatIndex路径:
    用于删除

根据文档,返回的属性用作动画的起点,终点是布局返回的常规属性(或删除时返回的相反属性)。布局属性包括位置、alpha、变换。。。 当然,编写自己的布局类要比使用Apple提供的流布局做更多的工作

编辑:为了回答您在评论中的问题,这里是一个超级基本的布局实现,用于所有大小相同的项目行

单元格有一个
框架,默认情况下,
alpha
为1.0(由
layouttributesforitematindexpath:
定义)。删除时,其属性将从删除前的当前状态设置为动画,由
finalLayoutAttributesForDisappearingItemAtIndexPath:
设置的属性对应于相同的
帧和0.0的
alpha
。所以它不会移动,但会消失。但是,右边的单元格将被移到左边(因为它们的
indexPath
已更改,因此它们的
帧也将更改,如
layouttributesforitematindexpath:
所设置的那样)

-(CGSize)集合视图内容大小
{
NSInteger numberOfItems=[self.collectionView numberOfItems部分:0];
返回CGSizeMake(numberOfItems*项目宽度、项目高度);
}
-(UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:(NSIndexPath*)indexPath
{
NSUInteger索引=[IndexXPath indexAtPosition:0];
UICollectionViewLayoutAttributes*属性=[UICollectionViewLayoutAttributes LayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
attributes.frame=CGRectMake(索引*项目宽度,0,项目宽度,项目高度);
返回属性;
}
-(NSArray*)布局属性ForElementsInRect:(CGRect)rect
{
NSMUTABLEARRY*属性=[NSMUTABLEARRY new];
NSUInteger firstIndex=地板(CGRectGetMinX(rect)/项目宽度);
NSUInteger lastIndex=ceilf(CGRectGetMaxX(rect)/项目宽度);
对于(nsuiger index=firstIndex;index下载。这是一个使用

initialLayoutAttributesForAppearingItemAtIndexPath:  
finalLayoutAttributesForDisappearingItemAtIndexPath:  

这对你来说将是一个很好的工作材料。

谢谢纪尧姆。但是,你能给我一个具体的例子吗?假设我想确保我的单元格在被删除时会消失,我如何在我的自定义UICollectionViewLayout中实现它?我添加了一个例子来回答你的问题。根据文档,
ini的结果tialLayoutAttributesForAppearingItemAtIndexPath
已为零。
initialLayoutAttributesForAppearingItemAtIndexPath:  
finalLayoutAttributesForDisappearingItemAtIndexPath: