uicollectionviewcontroller tutorial example collection ios swift collectionview

ios - tutorial - uicollectionviewcell swift



Multiple collectionView en un UIViewController-IOS swift (4)

Intenté muchos días darme cuenta de esto:

Quiero agregar en mi UIViewController dos CollectionView diferentes. Por ejemplo, quiero poner imágenes en estas collectionView. Cada CollectionView usa sus propias imágenes. es posible?

Seré muy feliz si alguien me puede echar una mano. :)


Aquí está mi versión de trabajo para swift 4:

Este código va en un archivo auxiliar separado:

import UIKit class collectionViews { static func collectionViewOne() -> UICollectionView { let layout = UICollectionViewFlowLayout() let collectionViewOne = UICollectionView(frame: CGRect(x: 0, y: 20, width: 200, height: 100), collectionViewLayout: layout) return collectionViewOne } static func collectionViewTwo() -> UICollectionView { let layout = UICollectionViewFlowLayout() let collectionViewTwo = UICollectionView(frame: CGRect(x: 0, y: 300, width: 200, height: 100), collectionViewLayout: layout) return collectionViewTwo } }

Y aquí está el código del controlador de vista:

import UIKit class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { let collectionViewOne = collectionViews.collectionViewOne() let collectionViewTwo = collectionViews.collectionViewTwo() var myArray = ["1", "2"] var myArray2 = ["3", "4"] override func viewDidLoad() { super.viewDidLoad() collectionViewOne.delegate = self collectionViewOne.dataSource = self collectionViewOne.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "MyCell") view.addSubview(collectionViewOne) collectionViewTwo.delegate = self collectionViewTwo.dataSource = self collectionViewTwo.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "MyCell2") view.addSubview(collectionViewTwo) } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { if collectionView == self.collectionViewOne { return myArray.count } else { return myArray2.count } } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { if collectionView == self.collectionViewOne { let myCell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath as IndexPath) myCell.backgroundColor = UIColor.red return myCell } else { let myCell2 = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell2", for: indexPath as IndexPath) myCell2.backgroundColor = UIColor.blue return myCell2 } } }

Result


Esto es posible, solo necesita agregar cada UICollectionView como una subvista y configurar el delegado y dataSource en su UIViewController.

Aquí hay un ejemplo rápido. Suponiendo que tiene un UICollectionView funcionando, debería poder adaptar este código a sus propios usos para agregar un segundo con bastante facilidad:

let collectionViewA = UICollectionView() let collectionViewB = UICollectionView() let collectionViewAIdentifier = "CollectionViewACell" let collectionViewBIdentifier = "CollectionViewBCell" override func viewDidLoad() { // Initialize the collection views, set the desired frames collectionViewA.delegate = self collectionViewB.delegate = self collectionViewA.dataSource = self collectionViewB.dataSource = self self.view.addSubview(collectionViewA) self.view.addSubview(collectionViewB) }

En la función de delegado cellForItemAtIndexPath:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { if collectionView == self.collectionViewA { let cellA = collectionView.dequeueReusableCellWithReuseIdentifier(collectionViewAIdentifier) as UICollectionViewCell // Set up cell return cellA } else { let cellB = collectionView.dequeueReusableCellWithReuseIdentifier(collectionViewBIdentifier) as UICollectionViewCell // ...Set up cell return cellB } }

En la función numberOfItemsInSection:

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { if collectionView == self.collectionViewA { return 0 // Replace with count of your data for collectionViewA } return 0 // Replace with count of your data for collectionViewB }


Sí, esto es completamente posible. Puede asignar sus respectivos UICollectionViewDelegates / UICollectionViewDataSources a diferentes clases o subclasificar los CollectionViews, asignando tanto el delegado como la fuente de datos a su viewController actual y rechazar su referencia a collectionView en los métodos de delegación de la siguiente manera:

@IBOutlet collectionViewA: CustomCollectionViewA! @IBOutlet collectionViewB: CustomCollectionViewB! func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { if let a = collectionView as? CustomCollectionViewA { return a.dequeueReusableCellWithIdentifier("reuseIdentifierA", forIndexPath: indexPath) } else { return collectionView.dequeueReusableCellWithIdentifier("reuseIdentifierB", forIndexPath: indexPath) } }


crear salidas para las vistas de colección correspondientes: salidas:

@IBOutlet weak var collectionView: UICollectionView! @IBOutlet weak var SecondCollectioView: UICollectionView!

método:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "customCell", for: indexPath) as UICollectionViewCell if(collectionView == self.SecondCollectioView) { cell.backgroundColor = UIColor.black } else { cell.backgroundColor = self.randomColor() } return cell; }

Esto será de otra manera.