Анимация UICollectionView изменить размер дополнительного представления

Я использую CSStickyHeaderFlowLayout с https://github.com/jamztang/CSStickyHeaderFlowLayout

и как часть моего приложения я имею в представлении заголовка / ячейке кнопку, которая отправляет в представление коллекции, что это должно расти. в свою очередь, представление коллекции изменяет предпочтительный размер заголовка в CSStickyHeaderFlowLayout и отправляет invalidateLayout в CSStickyHeaderFlowLayout. Попытка анимировать с помощью аниме-блока не работает должным образом, так как она перемещает заголовок от кнопки вверх. Это делает это действительно странной вещью. есть ли способ для flowLayout правильно анимировать изменения в дополнительном представлении?

это мой код для изменения размера.

- (void)treckDetailMapCellSizeToggle:(BOOL)toggle {
    //Modifier l'attribu de la map et invalider le layout pour le redessiner.
    CSStickyHeaderFlowLayout *layout = (id)self.collectionViewLayout;
    if ([layout isKindOfClass:[CSStickyHeaderFlowLayout class]]) {
        [UIView animateWithDuration:0.5 animations: ^{
            if (isMapCellExpended) {
                isMapCellExpended = NO;
                layout.parallaxHeaderReferenceSize = CGSizeMake(self.view.frame.size.width, HEADER_VIEW_PREFERED_SIZE);
            }
            else {
                isMapCellExpended = YES;
                layout.parallaxHeaderReferenceSize = CGSizeMake(self.view.frame.size.width, HEADER_VIEW_MAX_SIZE);
            }

            [layout invalidateLayout];
        }];
    }
}

Это видео о том, что происходит, когда я нажимаю кнопку "Ajouter a la carte".

https://www.youtube.com/watch?v=aqm99HebvwE

Редактировать:

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

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    CSStickyHeaderFlowLayout *layout = (id)self.collectionViewLayout;

    if ([layout isKindOfClass:[CSStickyHeaderFlowLayout class]]) {
        [self.collectionView performBatchUpdates: ^{
            preferedSize = preferedSize == 200 ? 300 : 200;
            layout.parallaxHeaderReferenceSize = CGSizeMake(self.view.frame.size.width, preferedSize);
        } completion: ^(BOOL finished) {
        }];

    }
}

1 ответ

Чтобы оживить изменение размера, сделайте недействительным макет в закрытии анимации вида. Сам размер должен быть установлен через соответствующий метод делегата макета, например collectionView(collectionView:collectionViewLayout:referenceSizeForHeaderInSection:)

UIView.animate(withDuration: 0.33) {
  self.collectionView.collectionViewLayout.invalidateLayout()
}

Вместо того, чтобы пытаться оживить изменения самостоятельно, вы должны позвонить

[collectionView.collectionViewLayout invalidateLayout];

UICollectionView не может свернуть или удалить дополнительный вид

Другие вопросы по тегам