¿Cómo animo las vistas internas de una celda de vista de colección mientras cambio su tamaño?

Tengo una vista de colección, y voy por el efecto en el que cuando se toca una celda, crece para ocupar toda la pantalla. Para lograr esto, básicamente estoy llamando a performBatchUpdates dentro de didSelectItemAtIndexPath , y el sizeForItemAtIndexPath sabe que devuelve un tamaño mayor para una celda seleccionada. Todo funciona bastante bien, la celda crece y se contrae según lo deseado.

El problema está dentro de la celda. La celda de vista de colección está formada por una jerarquía de vista moderadamente compleja administrada por restricciones. Quiero que las vistas secundarias de la celda crezcan y se encojan con la celda de animation. Desafortunadamente, mis subprocesss se ajustan de inmediato a su nueva position, ya que la célula lentamente anima a su nuevo tamaño. ¿Cómo puedo garantizar que el contenido de la celda se anima con el tamaño de la celda?

Estos son los dos methods relevantes del controller de vista de colección:

 - (CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { if ([collectionView.indexPathsForSelectedItems containsObject:indexPath]) return CGSizeMake(collectionView.bounds.size.width - 20, collectionView.bounds.size.height - (20 + [self.topLayoutGuide length])); else return CGSizeMake(260, 100); } - (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { [collectionView performBatchUpdates:nil completion:nil]; } 

Tuve exactamente el mismo problema. Después de muchos bashs, el siguiente código hizo el truco para mí. Llamar a layoutIfNeed directamente después de la actualización por lotes con una duración de 3.0 (+ – la duración del batchupdate) animó las restricciones.

 [self performBatchUpdates:nil completion:nil]; // IndexPath of cell to be expanded UICollectionViewCell *cell = [self cellForItemAtIndexPath:indexPath]; [UIView animateWithDuration:0.3 animations:^{ [cell.contentView layoutIfNeeded]; }]; 

Me gustaría ampliar la respuesta de Antoine. Llamar a performBatchUpdates:completion: dentro del bloque de animation realmente establecerá la duración del tamaño de celda y coincidirá con el tamaño del contenido.

 [UIView animateWithDuration:0.3 animations:^{ [self performBatchUpdates:^{ // set flags needed for new cell size calculation } completion:nil]; [collectionView layoutIfNeeded]; }]; 

De esta manera, también puedes jugar con el time de animation o incluso usar animaciones de spring.

Tengo el mismo problema. Agregue estos a su subclass de CollectionViewCell. Esto funciona para mi.

 // ProblematicCollectionViewCell.swift override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) { super.apply(layoutAttributes) layoutIfNeeded() } 

Aquí está el enlace original: https://codedump.io/share/LXZwAOOMxafU/1/uicollectionviewcell—contents-do-not-animate-alongside-cell39s-contentview la respuesta está en los comentarios.