gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 07:59:13 33 4
gpt4 key购买 nike

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

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

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

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

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

谢谢

更新

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

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

return nil;
}

就是这样! :)

最佳答案

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

  • initialLayoutAttributesForAppearingItemAtIndexPath: 用于插入

  • finalLayoutAttributesForDisappearingItemAtIndexPath: 用于删除

根据文档,你返回的属性作为动画的起点,终点是你的布局返回的普通属性(或者相反,删除)。布局属性包括position, alpha, transform...当然,自己写布局类比使用Apple提供的流式布局要麻烦一些。

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

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

- (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;
}

关于iphone - UICollectionView 动画(插入/删除项目),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16690831/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com