How to make both header and footer in collection view with swift
You can make an UICollectionViewController
to handle the UICollectionView
and in Interface Builder activate the Footer and Header sections, then you can use the following method for preview in you UICollectionView
the two sections added :
override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
switch kind {
case UICollectionView.elementKindSectionHeader:
let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "Header", for: indexPath)
headerView.backgroundColor = UIColor.blue
return headerView
case UICollectionView.elementKindSectionFooter:
let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "Footer", for: indexPath)
footerView.backgroundColor = UIColor.green
return footerView
default:
assert(false, "Unexpected element kind")
}
}
In the above code I put the identifier
for the footer and header as Header
and Footer
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 of UICollectionReusableView
for each and customize it as you want.
You can register your custom footer and header classes in Interface Builder or in code with:
registerClass(myFooterViewClass, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "myFooterView")
add custom header to collection view swift
You need to call viewForSupplementaryElementOfKind
like this:
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
switch kind {
case UICollectionElementKindSectionHeader:
let reusableview = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "HCollectionReusableView", for: indexPath) as! HCollectionReusableView
reusableview.frame = CGRect(0 , 0, self.view.frame.width, headerHight)
//do other header related calls or settups
return reusableview
default: fatalError("Unexpected element kind")
}
}
This way you can initialise and show the header
Another way of setting the UICollectionViewHeader frame is by extending UICollectionViewDelegateFlowLayout
like this:
extension UIViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
return CGSize(width: collectionView.frame.width, height: 100) //add your height here
}
}
This removes the need to call :
reusableview.frame = CGRect(0 , 0, self.view.frame.width, headerHight)
in the above mentioned
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView
Remember to register the HeaderView after you initialise your
UICollectionView
by calling:
collectionView.register(UINib(nibName: HCollectionReusableView.nibName, bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "HCollectionReusableView")
Swift 4.1 Update
UICollectionElementKindSectionHeader
has been renamed to UICollectionView.elementKindSectionHeader
UICollectionView Header and Footer View
Try it...
First register class in ViewDidLoad
registerClass(myFooterViewClass, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "Footer")
then use this method
override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
switch kind {
case UICollectionElementKindSectionHeader:
let header = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "Header", forIndexPath: indexPath) as! UICollectionReusableView
header = SomeView
return header
case UICollectionElementKindSectionFooter:
let footer = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "Footer", forIndexPath: indexPath) as! UICollectionReusableView
footer= SomeView
return footer
default:
print("anything")
}
}
I hope it help...
Unable to add footer to Collection View
How I do it:
1) Create custom footer class:
import UIKit
class BlackFooterView: UICollectionReusableView {
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .black
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
2) Register Footer class in UICollectionView
and setup reference size (Usually in the viewDidLoad
method of needed ViewController
:
override func viewDidLoad() {
super.viewDidLoad()
/// Class registration
self.collectionView!.register(BlackFooterView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: footerReuseIdentifier)
/// Reference size
(self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout).footerReferenceSize = CGSize(width: collectionView.bounds.width, height: 50)
}
3) Implement delegate methods:
override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
if kind == UICollectionView.elementKindSectionFooter {
return collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: footerReuseIdentifier, for: indexPath)
}
/// Normally should never get here
return UICollectionReusableView()
}
4) Voila:
Sample provided in Swift 4.2
NB:
- Cells generation code is not included.
- I used
UICollectionViewController
class for the sample, that's whydelegate
methods started fromoverride
- You can also create footers from XIBs. In that case registration should be done using registerNib:forSupplementaryViewOfKind:withReuseIdentifier: method.
Custom Footer view for UICollectionview in swift
Collection views handle headers and footers differently than table views. You'll need to:
Register your footer view class using:
registerClass(myFooterViewClass, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "myFooterView")
Either set the
headerReferenceSize
on your collection view layout or implementcollectionView:layout:referenceSizeForHeaderInSection:
in yourdelegate
.Return the footer view from the following method in your
dataSource
:func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
let view = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionFooter, withReuseIdentifier: "myFooterView", forIndexPath: indexPath)
// configure footer view
return view
}
I think that's everything!
Related Topics
How to Disable Calayer Implicit Animations
Ipad: Drag a Uitableviewcell from One Uitableviewcontroller and Drop It into Another
How to Compare Ssl Certificates Using Afnetworking
Opengl Es 2.0 Object Picking on iOS
Request Permissions Again After User Denies Location Services
Run a Swift 2.0 App Forever in Background to Update Location to Server
Uialertcontroller Text Alignment
Alternatives to Weak Linking in iPhone Sdk
Detect When a Webview Video Becomes Fullscreen on iOS8
How to Get Screen Size Using Code on iOS
iOS Autolayout Vertically Equal Space to Fill Parent View
Could Not Find a Valid Googleservice-Info.Plist in Your Project
How to Cache Resources Loaded in an iPhone Uiwebview
Nsurlsession "Http Load Failed Kcfstreamerrordomainssl, -9813 ; Self Signing Certificate
Re-Authenticating User Credentials Swift
Apns Notifications Not Reaching Devices Enrolled in Apple Mdm