Анимация кадра и изменение макета UICollectionView

Я пытаюсь создать эффект, когда я изменяю макет своего UICollectionView при изменении размера кадра

Первоначально макет collectionView представляет собой полноэкранный стиль галереи "thumbnail".

После изменения размера рамки на тонкую полоску - я хотел бы представить макет стиля "полоска фильма"

оба макета независимо работают нормально и как ожидалось.

Я попробовал код, похожий на этот:

[UIView animateWithDuration:1
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^{
                         self.collectionview.frame = newFrame; // animate the frame size


                     }
                     completion:^(BOOL finished) {
                        [self.collectionView.collectionViewLayout invalidateLayout];

    [self.collectionView setCollectionViewLayout:filmstriplayout animated:YES];    // now set the new layout
                     }];

Но он выглядит очень изменчивым и не изменяет размер, как ожидалось.

Есть ли способ, которым я мог бы изменить макет коллекции и размер кадра одновременно во время анимации изменения?

Ответ 1

У меня нет конкретного ответа, но несколько советов для рассмотрения.

UICollectionView не всегда корректно обрабатывает экземпляры макета. Вот хорошее обсуждение проблемы и некоторые обходные пути.

Но то, что я на самом деле делал на практике, работало для меня, было реализовать оба макета в одном классе, который знает, как переключаться между режимами макета. Я обнаружил, что режимы переключения макета в блоке обновления пакета были менее проблематичными, чем использование setCollectionViewLayout с двумя разными экземплярами макета:

[self.collectionView performBatchUpdates:^{
    MyLayout *layout = (MyLayout *)self.collectionView.collectionViewLayout;
    layout.mode = otherLayoutMode;
} completion:nil];

Ответ 2

Сначала установите размер элемента сетки, например gridItemSize = CGSizeMake(98, 98);, затем выполните пакетное действие UICollectionView. Элементы в виде коллекции меняют свои размеры с помощью анимации.:)

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout*)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
   return CGSizeMake(gridItemSize.width, gridItemSize.height);
}

[self.collectionview performBatchUpdates:^{
    [self.collectionview.collectionViewLayout invalidateLayout];
    [self.collectionview setCollectionViewLayout:self.collectionview.collectionViewLayout animated:YES];
} completion:^(BOOL finished) {    
}];

Ответ 3

Вот простой трюк, когда вы обновляете CollectionView, используйте это:

[self.collectionView removeFromSuperview]; //First remove the Collection View

//Relocate the view with layouts
UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
layout.minimumInteritemSpacing = 10;
layout.minimumLineSpacing = 10;

 self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.width,100) collectionViewLayout:layout];
[self.collectionView setDataSource:self];
[self.collectionView setDelegate:self];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.collectionView reloadData];

[self.view addSubview:self.collectionView];