Анимация изменения высоты UICollectionView

У меня есть UICollectionView, который является subview из UIScrollView (это необходимо из-за вещей выше и ниже представления коллекции.

Так или иначе...

Представление коллекции показывает три элемента в строке и только две строки для начала.

Первые пять элементов — это фактические элементы, а последний элемент — элемент «Подробнее».

Когда последний элемент нажат, я изменяю количество отображаемых элементов и обновляю представление коллекции...

NSMutableArray *indexPaths = [NSMutableArray array];

for (int i = 5 ; i<self.facilities.count ; i++) {
    [indexPaths addObject:[NSIndexPath indexPathForItem:i inSection:0]];
}

// changing the tableCollapsed bool updates the number of items
if (self.isTableCollapsed) {
    self.tableCollapsed = NO;
    [self.collectionView insertItemsAtIndexPaths:indexPaths];
} else {
    self.tableCollapsed = YES;
    [self.collectionView deleteItemsAtIndexPaths:indexPaths];
}

потом бегу...

[self setHeightAnimated:YES];

Что делает это...

- (void)setHeightAnimated:(BOOL)animated
{
    NSInteger numberOfRows = (NSInteger) ceilf((CGFloat)[self getNumberOfItems] / self.numberOfItemsPerRow);

    self.heightConstraint.constant = numberOfRows * self.rowHeight;

    if (animated) {
        [UIView animateWithDuration:0.2
                         animations:^{
                             [self layoutIfNeeded];
                         }];
    } else {
        [self layoutIfNeeded];
    }
}

Это всегда работает и устанавливает правильную высоту и получает правильное значение animated, когда оно должно быть YES или NO. Однако он никогда не оживляется. Он просто сразу переключается на новую высоту.

Я предполагаю, что это из-за какого-то кода макета, который запускается или что-то в этом роде, но мне было интересно, знает ли кто-нибудь, как лучше всего это сделать, чтобы высота правильно менялась с указанной мной анимацией.

Спасибо


person Fogmeister    schedule 13.08.2015    source источник


Ответы (1)


ХОРОШО! Через пару часов нашел решение.

Я переместил блок вставки в такой метод...

- (void)addItemsAtIndexPaths:(NSArray *)indexPaths {
    [UIView performWithoutAnimation:^{
        [self.collectionView insertItemsAtIndexPaths:indexPaths];
    }];
    [self setHeightAnimated:YES completion:nil];
}

Здесь используется метод, о котором я не знал performWithoutAnimation, для добавления элементов в представление коллекции. Затем я анимирую высоту независимо от этого.

Работает как шарм.

Обратно тоже работает...

- (void)removeItemsAtIndexPaths:(NSArray *)indexPaths {
    [self setHeightAnimated:YES completion:^(BOOL finished) {
        [UIView performWithoutAnimation:^{
            [self.collectionView deleteItemsAtIndexPaths:indexPaths];
        }];
    }];
}

Это сначала анимирует высоту, а затем удаляет элементы без анимации.

person Fogmeister    schedule 13.08.2015