UICollectionView con celdas autodimensionadas cambia el tamaño de las celdas durante la inserción / eliminación de la animation

Tengo una simple UICollectionView con UICollectionViewFlowLayout que utiliza la function de autoajuste para permitir las celdas de tamaño propio. Las cosas funcionan bien en un layout estático, pero cuando inserto o elimino celdas, las celdas cambian de tamaño al tamaño estimado:

[self.collectionView performBatchUpdates:^{ [self.collectionView insertItemsAtIndexPaths:@[indexPath]]; } completion:nil]; 

Más allá de configurar el tamaño estimado, así:

 layout.estimatedItemSize = CGSizeMake(88.0, 88.0); 

No estoy haciendo nada elegante en la vista de la colección. Todo se configura con storyboards.

¿Cómo puedo evitar este cambio de tamaño? Solo me dirijo a iOS 8.0 o superior, así que debería ser compatible.

ejemplo del problema

Una solución directa es implementar el método UICollectionViewDelegateFlowLayout

  func collectionView(_ collectionView: UICollectionView, layoutcollectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { // calculate string size here } 

Y después de insert o eliminar celdas, asegúrese de invalidar el layout para que el método de delegado se vuelva a llamar

 collectionView.performBatchUpdates({ // insert/delete items here }) { (success: Bool) in collectionView.collectionViewLayout.invalidateLayout() } 
  1. Establezca la propiedad estimatedItemSize en un tamaño adecuado.

  2. En su class personalizada, UICollectionView reemplaza a continuación el método y el tamaño de layoutAttributes de caching dado por super.

     -(UICollectionViewLayoutAttributes*)prefernetworkingLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes { UICollectionViewLayoutAttributes * superAttr = [super prefernetworkingLayoutAttributesFittingAttributes:layoutAttributes]; //Cache size which is returned by super (superAttr.frame.size) since super calculates the correct size for auto size cells. return superAttr; } 

3.En sizeForItemAtIndexPath devolver el tamaño en caching si está disponible, más el tamaño estimado.

 -(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { //return cached size if available else the estimated size }