Actualización de layout de UICollectionView: el tamaño del elemento no cambia

Tengo un problema con el tamaño del elemento de collectionView. Quiero mostrar 3 elementos en la fila para el modo Retrato y 6 para el paisaje. He configurado -layoutSubviews como este:

- (void)layoutSubviews { [super layoutSubviews]; if ([[UIApplication shanetworkingApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || ([[UIApplication shanetworkingApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown)) { //Portrait orientation self.flowLayoutPortrait.itemSize = CGSizeMake(106, 106); } else if ([[UIApplication shanetworkingApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || ([[UIApplication shanetworkingApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)) { //Landscape orientation self.flowLayoutPortrait.itemSize = CGSizeMake(93, 93); } [self.collectionView.collectionViewLayout invalidateLayout]; } 

Pero el tamaño de la celda no se actualiza, siempre permanece igual para ambas orientaciones. Si creo 2 flowLayouts y el uso:

 [self.collectionView setCollectionViewLayout:self.flowLayoutLandscape]; 

Todo funciona, pero realmente no me gusta cómo se cambian. La animation es realmente mala. Y debido a que itemSize es la única propiedad que debe actualizarse, usar 1 layout parece ser la mejor opción.

¿Cómo puedo decirle a collectionView para actualizar el layout?

Utilicé este método y esto fue muy bueno para mí:

 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { if (_isLandscape) return CGSizeMake(yourLandscapeWidth, yourLandscapeHeight); else return CGSizeMake(yourNonLandscapeWidth, yourNonLandscapeHeight); } 

Puede ser que se puede utilizar una celda diferente para el modo retrato / paisaje con diferentes identificadores … que solo tiene que volver a cargar los datos para la vista de colección de lo que definitivamente funcionará.

 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ if ([[UIApplication shanetworkingApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || ([[UIApplication shanetworkingApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown)) { //Portrait orientation //dequeue cell for portrait mode } else if ([[UIApplication shanetworkingApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft || ([[UIApplication shanetworkingApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)) { //Landscape orientation //dequeue cell for landscape mode } return cell; }