How to make both header and footer in collection view in swift ?
I'm trying to combine a header and a footer together but it keep crashing, I couldn't find swift tutorial to understand it.
I don't how to return supplementary view for both rather just one .
I set them both on the storyboard (class + identifier )
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
//#warning Incomplete method implementation -- Return the number of sections
return 2
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
//#warning Incomplete method implementation -- Return the number of items in the section
return 10
}
override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
var header: headerCell!
var footer: footerCell!
if kind == UICollectionElementKindSectionHeader {
header =
collectionView.dequeueReusableSupplementaryViewOfKind(kind,
withReuseIdentifier: "header", forIndexPath: indexPath)
as? headerCell
}
return header
}
Error: UICollectionElementKindCell with identifier one - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> profileCC {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("one", forIndexPath: indexPath) as! profileCC
// Configure the cell
return cell
}
override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
switch kind {
case UICollectionElementKindSectionHeader:
let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "header", forIndexPath: indexPath) as! headerCell
headerView.backgroundColor = UIColor.blueColor();
return headerView
case UICollectionElementKindSectionFooter:
let footerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "footer", forIndexPath: indexPath) as! footerCell
footerView.backgroundColor = UIColor.greenColor();
return footerView
default:
assert(false, "Unexpected element kind")
}
}
I hope someone will help.
Solution
You can make an
UICollectionViewController
to handle theUICollectionView
and in Interface Builder activate the Footer and Header sections, then you can use the following method for preview in youUICollectionView
the two sections added :In the above code I put the
identifier
for the footer and header asHeader
andFooter
for example, you can do it as you want. If you want to create a custom header or footer then you need to create a subclass ofUICollectionReusableView
for each and customize it as you want.You can register your custom footer and header classes in Interface Builder or in code in the following way:
Updated for Swift 3+
Step 1:
In your view controller class, register the class to be used as a header, footer, or both:
Step 2:
If using a xib, use:
If not using a xib:
Step 3:
Create a custom header/footer class, implementation looks like:
Step 4: If not using a xib, ignore
Create a new empty xib: "File --> New File --> Empty".
Name it the exact same name as the class. In this example: "MyHeaderFooterClass"
Step 5: - Support that new cell in your collection view via delegate method:
After using @mobilecat code you should use this function to make the header and footer appear
Just to complement the remaining answers, don't forget to allocate space for your header/footer views, otherwise
collectionView:viewForSupplementaryElementOfKind:atIndexPath
won't be called.Do so by implementing
collectionView:layout:referenceSizeForHeaderInSection
in your collectionView datasource.