27

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

我需要这个的原因是,默认情况下,我看到插入一个单元格具有平滑的动画淡入淡出,但是删除一个单元格具有向左移动 + 淡出动画的组合。如果不是因为一个问题,我会对此感到非常高兴。

在我删除一个单元格后,当我添加新单元格时,它仍然会被重用,而当它被重用时,它不是以默认淡入效果添加的,而是向左移动 + 淡入的组合。

我不确定为什么我在动画中会出现这种不一致。如果这是一个已知的错误/问题/愚蠢(在我这边:))请告诉我如何解决它。

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

谢谢

更新

通过继承 UICollectionViewFlowLayout 并添加这行代码来修复奇怪的动画行为

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

      return nil;
}

而已!:)

4

2 回答 2

33

如果你使用你自己的子类UICollectionViewLayout,你可以实现这些方法:

  • initialLayoutAttributesForAppearingItemAtIndexPath:用于插入

  • finalLayoutAttributesForDisappearingItemAtIndexPath:用于删除

根据文档,您返回的属性用作动画的起点,终点是您的布局返回的正常属性(或相反的删除)。布局属性包括position、alpha、transform……当然,编写自己的布局类比使用Apple提供的流式布局更费力。

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

一个单元格的 aframe和默认alpha为 1.0(由 定义layoutAttributesForItemAtIndexPath:)。当它被删除时,它的属性会从删除前的当前状态动画到由 设置的属性finalLayoutAttributesForDisappearingItemAtIndexPath:,它们对应相同framealpha0.0。所以它不会移动,但会淡出。但是,右侧的单元格将向左移动(因为它们indexPath已更改,因此它们frame由 设置layoutAttributesForItemAtIndexPath:)。

- (CGSize)collectionViewContentSize
{
    NSInteger numberOfItems = [self.collectionView numberOfItemsInSection:0];
    return CGSizeMake(numberOfItems * ITEM_WIDTH, ITEM_HEIGHT);
}

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger index = [indexPath indexAtPosition:0];
    UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    attributes.frame = CGRectMake(index * ITEM_WIDTH, 0, ITEM_WIDTH, ITEM_HEIGHT);
    return attributes;
}

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSMutableArray *attributes = [NSMutableArray new];
    NSUInteger firstIndex = floorf(CGRectGetMinX(rect) / ITEM_WIDTH);
    NSUInteger lastIndex = ceilf(CGRectGetMaxX(rect) / ITEM_WIDTH);
    for (NSUInteger index = firstIndex; index <= lastIndex; index++) {
        NSIndexPath *indexPath = [[NSIndexPath alloc] initWithIndexes:(NSUInteger [2]){ 0, index } length:2];
        [attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]];
    }
    return attributes;
}

- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath];
    attributes.alpha = 0.0;
    return attributes;
}
于 2013-05-22T11:59:21.477 回答
7

下载 圆形布局。这是一个示例自定义布局,使用

initialLayoutAttributesForAppearingItemAtIndexPath:  
finalLayoutAttributesForDisappearingItemAtIndexPath:  

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

于 2013-05-22T12:41:57.857 回答