tutorial source how example data collection swift uicollectionview uicollectionviewcell uicollectionviewlayout

swift - source - ¿Cómo establecer el espaciado entre celdas y UICollectionView-UICollectionViewFlowLayout ratio de tamaño?



uicollectionview swift 4 (8)

Agrega estas 2 líneas

layout.minimumInteritemSpacing = 0 layout.minimumLineSpacing = 0

Así que tienes:

// Do any additional setup after loading the view, typically from a nib. let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() layout.sectionInset = UIEdgeInsets(top: 20, left: 0, bottom: 10, right: 0) layout.itemSize = CGSize(width: screenWidth/3, height: screenWidth/3) layout.minimumInteritemSpacing = 0 layout.minimumLineSpacing = 0 collectionView!.collectionViewLayout = layout

Eso eliminará todos los espacios y le dará un diseño de cuadrícula:

Si desea que la primera columna tenga un ancho igual al ancho de la pantalla, agregue la siguiente función:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { if indexPath.row == 0 { return CGSize(width: screenWidth, height: screenWidth/3) } return CGSize(width: screenWidth/3, height: screenWidth/3); }

El diseño de la cuadrícula ahora se verá (también he agregado un fondo azul a la primera celda):

Estoy tratando de agregar UICollectionView a ViewController , y necesito tener 3 celdas ''por fila'' sin espacio en blanco entre las celdas (debería verse como una cuadrícula). El ancho de la celda debe ser un tercio del tamaño de la pantalla, por lo que pensé que el ancho del layout.item . Pero luego me sale esto:

Si reduzco ese tamaño (en 7 u 8 píxeles, por ejemplo), es mejor, pero la tercera celda de la fila no es completamente visible, y todavía tengo ese espacio en blanco (arriba y abajo, e izquierda y derecha).

class ViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource { var collectionView: UICollectionView? var screenSize: CGRect! var screenWidth: CGFloat! var screenHeight: CGFloat! override func viewDidLoad() { super.viewDidLoad() screenSize = UIScreen.mainScreen().bounds screenWidth = screenSize.width screenHeight = screenSize.height // Do any additional setup after loading the view, typically from a nib let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() layout.sectionInset = UIEdgeInsets(top: 20, left: 0, bottom: 10, right: 0) layout.itemSize = CGSize(width: screenWidth / 3, height: screenWidth / 3) collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout) collectionView!.dataSource = self collectionView!.delegate = self collectionView!.registerClass(CollectionViewCell.self, forCellWithReuseIdentifier: "CollectionViewCell") collectionView!.backgroundColor = UIColor.greenColor() self.view.addSubview(collectionView!) } func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return 1 } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 20 } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CollectionViewCell", forIndexPath: indexPath) as CollectionViewCell cell.backgroundColor = UIColor.whiteColor() cell.layer.borderColor = UIColor.blackColor().CGColor cell.layer.borderWidth = 0.5 cell.frame.size.width = screenWidth / 3 cell.frame.size.height = screenWidth / 3 cell.textLabel?.text = "/(indexPath.section):/(indexPath.row)" return cell } }


En ciertas situaciones, la configuración de UICollectionViewFlowLayout en viewDidLoad o ViewWillAppear puede no afectar a collectionView.

Establecer UICollectionViewFlowLayout en viewDidAppear puede hacer que se vean los cambios en el tamaño de las celdas en tiempo de ejecución.

Otra solución, en Swift 3:

extension YourViewController : UICollectionViewDelegateFlowLayout{ func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { return UIEdgeInsets(top: 20, left: 0, bottom: 10, right: 0) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let collectionViewWidth = collectionView.bounds.width return CGSize(width: collectionViewWidth/3, height: collectionViewWidth/3) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return 0 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return 20 } }


Para Swift 3+ y Xcode 9+ Intente usar esto

extension ViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let collectionWidth = collectionView.bounds.width return CGSize(width: collectionWidth/3, height: collectionWidth/3) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return 0 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return 0 }


Si está buscando Swift 3, siga los pasos para lograrlo:

func viewDidLoad() { //Define Layout here let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() //Get device width let width = UIScreen.main.bounds.width //set section inset as per your requirement. layout.sectionInset = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5) //set cell item size here layout.itemSize = CGSize(width: width / 2, height: width / 2) //set Minimum spacing between 2 items layout.minimumInteritemSpacing = 0 //set minimum vertical line spacing here between two lines in collectionview layout.minimumLineSpacing = 0 //apply defined layout to collectionview collectionView!.collectionViewLayout = layout }

Esto se verifica en Xcode 8.0 con Swift 3.


Para Swift 3 y XCode 8 , esto funcionó. Siga los pasos a continuación para lograr esto: -

{ let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() let width = UIScreen.main.bounds.width layout.sectionInset = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5) layout.itemSize = CGSize(width: width / 2, height: width / 2) layout.minimumInteritemSpacing = 0 layout.minimumLineSpacing = 0 collectionView!.collectionViewLayout = layout }

Coloque este código en la función viewDidLoad ().


Para Swift 3 y XCode 8, esto funcionó. Siga los pasos a continuación para lograr esto: -

viewDidLoad() { let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() var width = UIScreen.main.bounds.width layout.sectionInset = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5) width = width - 10 layout.itemSize = CGSize(width: width / 2, height: width / 2) layout.minimumInteritemSpacing = 0 layout.minimumLineSpacing = 0 collectionView!.collectionViewLayout = layout }


Swift 4

let collectionViewLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout collectionViewLayout?.sectionInset = UIEdgeInsetsMake(0, 20, 0, 40) collectionViewLayout?.invalidateLayout()


let layout = myCollectionView.collectionViewLayout as? UICollectionViewFlowLayout layout?.minimumLineSpacing = 8