Animar el marco y el cambio de layout de UICollectionView

Estoy intentando crear un efecto donde cambio el layout de mi UICollectionView mientras cambio el tamaño del marco

Inicialmente, el layout collectionView presenta una pantalla completa de estilo de galería "en miniatura".

Después de cambiar el tamaño del marco a una tira delgada, me gustaría presentar un layout de estilo de "tira de película"

Ambos layouts funcionan de forma independiente y según lo esperado.

Probé el código similar a esto:

[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 }]; 

Pero se ve muy entrecortado y no cambia el tamaño según lo esperado.

¿Hay alguna forma en que pueda cambiar el layout de la vista de colección y el tamaño de fotogtwig simultáneamente mientras se anima el cambio?

No tengo una respuesta específica, pero algunas sugerencias a considerar.

UICollectionView no siempre maneja las instancias de layout de conmutación con gracia. Aquí hay una buena discusión del problema y algunas soluciones .

Pero lo que realmente he hecho en la práctica que funcionó para mí fue implementar ambos layouts en una sola class que sabe cómo alternar entre los modos de layout. Descubrí que cambiar los modos de layout en un bloque de actualización por lotes era less problemático que usar setCollectionViewLayout con dos instancias de layout diferentes:

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

Primero establezca el tamaño del elemento de cuadrícula como gridItemSize = CGSizeMake(98, 98); luego realice la acción por lotes de UICollectionView. Los elementos en la vista de colección cambian sus tamaños con animation. 🙂

 - (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) { }]; 

Aquí está el truco simple siempre que esté actualizando CollectionView, use esto:

 [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];