UICollectionView Cell Spacing basado en el tamaño del tamaño del dispositivo

He implementado un UICollectionView, el tamaño de celda es w90 h90. Cuando lo ejecuto en el iPhone 6 obtengo el espacio adecuado entre las celdas, pero cuando lo hago en iPhone 5s obtengo más espacio entre las celdas. Mi pregunta es cómo puedo cambiar el tamaño de la celda en function del tamaño de la pantalla del dispositivo , supongo que si el tamaño de la celda fue w80 h80 obtendré los resultados adecuados en iPhone 5s también. lo que estoy haciendo actualmente es

override func viewWillAppear(animated: Bool) { var scale = UIScreen.mainScreen().scale as CGFloat println("Scale :\(scale)") var cellSize = (self.collectionViewLayout as UICollectionViewFlowLayout).itemSize println("Cell size :\(cellSize)") imageSize = CGSizeMake(cellSize.width * scale , cellSize.height * scale) println("Image size : \(imageSize)") } 

// sizeForItemAtIndexPath

  func collectionView(collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { return imageSize! } 

Resultado en el iPhone 6: introduzca la descripción de la imagen aquí

Resultado en iPhone 5s introduzca la descripción de la imagen aquí

Objective-C / Swift están bien para la solución. Gracias.

Paso 1: Implementar UICollectionViewDelegateFlowLayout (si no se hace).

Paso 2: utilice el método delegado de UICollectionViewDelegateFlowLayout.

 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { return CGSizeMake((UIScreen.mainScreen().bounds.width-15)/4,120); //use height whatever you wants. } 

Paso 3: vaya a XIB o StoryBoard donde tiene su CollectionView.

Paso 4: en XIB o StoryBoard donde tienes tu CollectionView haz clic en CollectionView.

Paso 5: vaya a InterfaceBuilder, luego en la segunda última pestaña (es decir: Size Inspector) establece Min Spacing

Para celdas = 5

Para líneas = 5

Que eso

Nota:

  • Esta solución es para si desea hacer un espacio entre celda = 5 .
  • Si su espaciado es diferente de 5 , entonces necesita cambiar el valor 15 en el método de delegado.
  • Ej: Espaciado entre celda = 10 , luego cambie delegado 15 a 10×3 = 30

return CGSizeMake((UIScreen.mainScreen().bounds.width-30)/4,120);

  • Y establecer distancia mínima

For Cells = 10

For Lines = 10

y viceversa.

Versión Swift 3

 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let width = UIScreen.main.bounds.width return CGSize(width: (width - 10)/3, height: (width - 10)/3) // width & height are the same to make a square cell } 

Para una respuesta ligeramente más flexible

Le permite ajustar el número de columnas y espaciado, ampliando la respuesta de Zaid Pathan

 // MARK: UICollectionViewDelegateFlowLayout delegate method func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { let cellSpacing = CGFloat(2) //Define the space between each cell let leftRightMargin = CGFloat(20) //If defined in Interface Builder for "Section Insets" let numColumns = CGFloat(3) //The total number of columns you want let totalCellSpace = cellSpacing * (numColumns - 1) let screenWidth = UIScreen.mainScreen().bounds.width let width = (screenWidth - leftRightMargin - totalCellSpace) / numColumns let height = CGFloat(110) //whatever height you want return CGSizeMake(width, height); } 

Objective-c ejemplo:

usa esta funcion

 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { return CGSizeMake(Your desinetworking width, Your desinetworking height); // example: return CGSizeMake(self.view.frame.size.width-20, 100.f); } 
 I wanted 3 item in a section in Both IPad and iPhone. I worked out using the following code. Hope it helps! 1 ) Implement UICollectionViewDelegateFlowLayout delegate 2 ) var device = UIDevice.currentDevice().model func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { if (device == "iPad" || device == "iPad Simulator") { return CGSizeMake((UIScreen.mainScreen().bounds.width-15)/3,230) } return CGSizeMake((UIScreen.mainScreen().bounds.width-10)/3,120) } 

Para ampliar la respuesta de Tim , hay una pequeña advertencia relacionada con los anchos de punto parciales: El networkingondeo de los anchos de puntos parciales puede hacer que el ancho sea más ancho que permitirá la cantidad de columnas deseadas. Una forma de evitar esto es truncar el ancho usando trunc ():

  return CGSizeMake(trunc(width), height)