如果你使用你自己的子类UICollectionViewLayout
,你可以实现这些方法:
根据文档,您返回的属性用作动画的起点,终点是您的布局返回的正常属性(或相反的删除)。布局属性包括position、alpha、transform……当然,编写自己的布局类比使用Apple提供的流式布局更费力。
编辑:要在评论中回答您的问题,这里是一个超级基本的布局实现,用于所有相同大小的项目行。
一个单元格的 aframe
和默认alpha
为 1.0(由 定义layoutAttributesForItemAtIndexPath:
)。当它被删除时,它的属性会从删除前的当前状态动画到由 设置的属性finalLayoutAttributesForDisappearingItemAtIndexPath:
,它们对应相同frame
和alpha
0.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;
}