Ответ 1
Если вы используете свой собственный подкласс UICollectionViewLayout
, вы можете реализовать методы:
-
initialLayoutAttributesForAppearingItemAtIndexPath:
для вставок -
finalLayoutAttributesForDisappearingItemAtIndexPath:
для удаления
В соответствии с документацией возвращаемые вами атрибуты используются в качестве отправных точек для анимации, а конечная точка - это обычные атрибуты, возвращаемые вашим макетом (или наоборот для удаления). Атрибуты макета включают положение, альфа, преобразование... Разумеется, больше написать свой собственный класс макета, чем использовать планируемый макет поставки Apple.
Изменить: Чтобы ответить на ваш вопрос в комментариях, вот супер базовая реализация макета для строк элементов, которые имеют одинаковый размер.
У ячейки есть frame
и по умолчанию 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;
}