Подтвердить что ты не робот

Анимация UICollectionView (вставка/удаление элементов)

Я хотел бы настроить стили анимации, когда UICollectionViewCell вставлен и/или удален.

Причина, по которой я нуждаюсь в этом, заключается в том, что по умолчанию я вижу, что вставка ячейки имеет плавное исчезновение в анимации, однако удаление ячейки имеет комбинацию анимации move-to-the-left + fade out. Я был бы очень доволен этим, если бы не одна проблема.

После того, как я удалю ячейку, она по-прежнему используется повторно, когда я добавляю новые, и когда она повторно используется, она добавляется не с эффектом по умолчанию, а вместо этого представляет собой комбинацию move-to-the-left + fade in.

Я не уверен, почему я получаю эту несогласованность в анимации. Если это известная ошибка/проблема/глупость (на моей стороне:)), пожалуйста, дайте мне знать, как ее исправить.

В противном случае дайте мне знать, как настроить пользовательскую анимацию, когда ячейка удалена (или указать мне на учебник).

Спасибо

UPDATE

Исправлено странное поведение анимации путем подкласса UICollectionViewFlowLayout и добавления этой строки кода

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

      return nil;
}

Что это!:)

4b9b3361

Ответ 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;
}

Ответ 2

Загрузите Layout круга. Это примерный макет, который использует

initialLayoutAttributesForAppearingItemAtIndexPath:  
finalLayoutAttributesForDisappearingItemAtIndexPath:  

Это будет хороший рабочий материал для вас.