Resolví usando dos UICollectionViewFlowLayout. Uno para retrato y otro para paisaje. Los asigno a mi collectionView dinámicamente en -viewDidLoad
self.portraitLayout = [[UICollectionViewFlowLayout alloc] init];
self.landscapeLayout = [[UICollectionViewFlowLayout alloc] init];
UIInterfaceOrientation orientationOnLunch = [[UIApplication sharedApplication] statusBarOrientation];
if (UIInterfaceOrientationIsPortrait(orientationOnLunch)) {
[self.menuCollectionView setCollectionViewLayout:self.portraitLayout];
} else {
[self.menuCollectionView setCollectionViewLayout:self.landscapeLayout];
}
Luego simplemente modifiqué mis métodos collectionViewFlowLayoutDelgate como este
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
CGSize returnSize = CGSizeZero;
if (collectionViewLayout == self.portraitLayout) {
returnSize = CGSizeMake(230.0, 120.0);
} else {
returnSize = CGSizeMake(315.0, 120.0);
}
return returnSize;
}
Por último, cambio de un diseño a otro en rotación
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
if (UIInterfaceOrientationIsPortrait(fromInterfaceOrientation)) {
[self.menuCollectionView setCollectionViewLayout:self.landscapeLayout animated:YES];
} else {
[self.menuCollectionView setCollectionViewLayout:self.portraitLayout animated:YES];
}
}
sizeForItemAtIndexPath
antes de llamardidRotateFromInterfaceOrientation
. Sin embargo, para una vista de colección con varias celdas en pantalla, invalidar el diseño antes de la rotación provoca un salto visible y desagradable en el tamaño antes de que la vista gire. En ese caso, creo que mi respuesta sigue siendo la implementación más correcta.I would like to adjust the size of each cell to **completely fit the size of the CollectionView**
cuál es exactamente la solución propuesta en mi respuesta. Si pudiera incluir mi solución en su respuesta y tomar nota de qué enfoque funciona mejor en qué condiciones, sería lo suficientemente bueno para mí.