Swift UICollectionView programmatically
UICollectionView programmatically
UICollectionView is flexible collection view. It’s like UITableView and programming style is also similar
Sample
I implemented UICollectionViewDelegate, UICollectionViewDataSource and
UICollectionViewDelegateFlowLayout.
Basically, all UI are codes not xib, also I don’t use any storyboard
class ViewController : UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
private let barSize : CGFloat = 44.0
private let kCellReuse : String = "PackCell"
private let kCellheaderReuse : String = "PackHeader"
private var collectionView : UICollectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: UICollectionViewFlowLayout()) // Initialization
override func viewDidLoad() {
super.viewDidLoad()
// Collection
self.collectionView.delegate = self // delegate : UICollectionViewDelegate
self.collectionView.dataSource = self // datasource : UICollectionViewDataSource
self.collectionView.backgroundColor = UIColor.clearColor()
// Register parts(header and cell
self.collectionView.registerClass(PackViewCell.self, forCellWithReuseIdentifier: kCellReuse) // UICollectionViewCell
self.collectionView.registerClass(PackCollectionSectionView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: kCellheaderReuse) // UICollectionReusableView
self.view.addSubview(self.collectionView)
}
override func viewWillLayoutSubviews() {
let frame = self.view.frame
self.collectionView.frame = CGRectMake(frame.origin.x, frame.origin.y + barSize, frame.size.width, frame.size.height - barSize)
}
// MARK: UICollectionViewDelegate, UICollectionViewDataSource
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
var cell : PackViewCell = collectionView.dequeueReusableCellWithReuseIdentifier(kCellReuse, forIndexPath: indexPath) as PackViewCell
return cell // Create UICollectionViewCell
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1 // Number of section
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
var res = 0
switch(section) {
case 0:
res = 4 // Number of cell per section(section 0)
break
default:
res = 0
break
}
return res
}
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
collectionView.deselectItemAtIndexPath(indexPath, animated: false)
// Select operation
}
func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
var reusableView : UICollectionReusableView? = nil
// Create header
if (kind == UICollectionElementKindSectionHeader) {
// Create Header
var headerView : PackCollectionSectionView = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: kCellheaderReuse, forIndexPath: indexPath) as PackCollectionSectionView
reusableView = headerView
}
return reusableView!
}
// MARK: UICollectionViewDelegateFlowLayout
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSize(width: 90, height: 90) // The size of one cell
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
return CGSizeMake(self.view.frame.width, 90) // Header size
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {
let frame : CGRect = self.view.frame
let margin = (frame.width - 90 * 3) / 6.0
return UIEdgeInsetsMake(10, margin, 10, margin) // margin between cells
}
}
UICollectionViewDelegateFlowLayout decides size of parts, cell, header, margin(insets) between cells
row and section starts from 0
