Vista de colección no actualiza el layout en rotation

Esta es la vista de la aplicación cuando está en modo vertical. introduzca la descripción de la imagen aquí

Cuando se gira al modo horizontal, se ve así

introduzca la descripción de la imagen aquí

El depurador de vista muestra que UIWindow no gira como se muestra aquí. introduzca la descripción de la imagen aquí

El UICollectionViewController se crea a través de StoryBoard. He intentado subclass UICollectionViewFlowLayout que implementa shouldInvalidateLayoutForBoundsChange , pero no soluciona mi problema.

 - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { CGRect oldBounds = self.collectionView.bounds; if (CGRectGetWidth(newBounds) != CGRectGetWidth(oldBounds)) { return YES; } return NO; } 

Proporcione ideas sobre qué verificar a continuación o sobre las requestes de código adicional para depurar.

Editar: como lo sugirió MirekE, intenté agregar restricciones a CollectionView pero no pude. Todas las opciones para Editor-> Pin no están disponibles para CollectionView . introduzca la descripción de la imagen aquí

Editar, respuesta a Andrea –

Estoy apuntando a iOS8.3. Mi entendimiento es que el método principal llamado en rotation es viewWillTransitionToSize:withTransitionCoordinator: que es del protocolo UIContentContainer . He agregado lo siguiente a mi CollectionViewController, pero el mismo problema persiste

 -(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator { [self.collectionView.collectionViewLayout invalidateLayout]; [self.collectionView reloadData]; } 

No sé qué versión de iOS dirigiste, pero supongo que sabes el process de rotation y los methods que se invocan en el controller de vista mientras está sucediendo.
En uno de esos methods, solo tiene que llamar:

 [self.collectionView.collectionViewLayout invalidateLayout]; 

y tal vez dependiendo de su layout -reloadData
No hay necesidad de subclass.

EDITAR

Utilizo este método, supongo que no funciona porque debes retransmitir la colección después de cambiar el tamaño:

 - (void) willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator]; [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { [self.collectionView.collectionViewLayout invalidateLayout]; } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { [self.collectionView reloadData]; }]; } 

Lo que estoy haciendo adjunta el process de invalidation de layout al process de animation.

Si tiene una implementación personalizada de UICollectionViewLayout, intente replace los methods:

 override public func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool { let bounds = self.collectionView!.bounds; return ((CGRectGetWidth(newBounds) != CGRectGetWidth(bounds) || (CGRectGetHeight(newBounds) != CGRectGetHeight(bounds)))); } override public func invalidateLayout() { cache.removeAll() // remove layout attributes ans settings if they exist super.invalidateLayout() } 

Saludos!

Parece que simplemente arrastra la vista de colección en el canvas, pero no añadió ninguna restricción. Entonces, cuando gira el dispositivo, el tamaño no cambia.

En el guión gráfico, select la vista de colección, luego click el ícono de Pines en la parte inferior de Xcode y agregue restricciones para los márgenes superior, izquierdo, inferior y derecho. Después de hacer eso, la vista de colección debe cambiar de tamaño en rotation.

El problema fue que la salida de collectionView no se configuró correctamente. Después de configurar la collectionView , todo funciona correctamente.

collectionView outlet no establecido:

introduzca la descripción de la imagen aquí

collectionView salida collectionView :

introduzca la descripción de la imagen aquí