Анимиране на промяната на височината на 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