Diferente tamaño de celda en UICollectionview

En mi aplicación para iPhone, estoy mostrando imágenes en una vista de colección. Obtengo las imágenes de las URL, con urls obtengo el tamaño de la image también. por ejemplo: digamos que hay dos types de imágenes: paisaje y retrato. Obtengo el valor P para imágenes de retrato y L para imágenes de paisaje

¿Cómo personalizar el tamaño de la celda de la colección?

Utilice este método UICollectionViewDelegateFlowLayout

  - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath; 

1) Podría mantener y cambiar varios objects de layout, pero hay una manera más simple. Simplemente agregue lo siguiente a su subclass UICollectionViewController y ajuste los tamaños según sea necesario:

 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { // Adjust cell size for orientation if (UIDeviceOrientationIsLandscape([[UIApplication shanetworkingApplication] statusBarOrientation])) { return CGSizeMake(170.f, 170.f); } return CGSizeMake(192.f, 192.f); } - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [self.collectionView performBatchUpdates:nil completion:nil]; } 

Llamar -performBatchUpdates:completion: invalidará el layout y cambiará el tamaño de las celdas con animation (puede pasar nil a ambos parametros de bloque si no tiene ajustes adicionales para realizar).

2) En lugar de codificar los tamaños de los elementos en -collectionView:layout:sizeForItemAtIndexPath , simplemente divida el alto o ancho de los límites de CollectionView por el número de celdas que desea ajustar en la pantalla. Use la altura si su UICollectionView desplaza horizontalmente o el ancho si se desplaza verticalmente.

Esto es lo que hice. Primero establecí el tamaño de la celda en function del tamaño de la pantalla (para que podamos get la mejor cantidad de imágenes en cada fila). Es posible que desee cambiar los numbers para adaptarse a su causa.

 -(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{ CGFloat widthOfCell =(self.view.frame.size.width-30)/2; CGFloat heightOfCell =widthOfCell * 1.33; CGSize returnValue = CGSizeMake(widthOfCell, heightOfCell); returnValue.height += 5; returnValue.width += 5; return returnValue; } 

Luego utilicé un método de manipulación de imágenes para determinar el estado horizontal o vertical, y (para mi aplicación) decidí hacer cada image un retrato:

  if (sourceImage.size.width>sourceImage.size.height) { sourceImage = [[UIImage alloc] initWithCGImage: sourceImage.CGImage scale: 1.0 orientation: UIImageOrientationRight]; } 

Si quieres tenerlo al revés, intercambia el > con <

CAVEAT: mi método de rotation no toma en consideración si la image está apuntando hacia la izquierda o hacia la derecha. En otras palabras, si una image es horizontal al revés, mi código no puede reconocerlo. ¡Espero que alguien más pueda ayudarlo, y espero no haber salido del rastro! 🙂

Para ampliar rápidamente la vista de flujo hacia el controller de vista, si necesita mostrar imágenes dinámicas en la celda, haga una variable que contenga el nombre de las imágenes en el control de la vista y use esto:

 let imageData = ["image1","image2","image3","image4"] extension yourViewController: UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout{ func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let photo = UIImage(named: imageData[indexPath.row]) return CGSize(width: (photo?.size.width)!, height: (photo?.size.height)!) } 

}