J'essaie d'ajouter un en-tête à collectionView
à l'aide d'un fichier xib personnalisé. J'ai créé le fichier xib
avec la classe implémentant UICollectionReusableView
. Dans collectionViewController
, j'ai enregistré le fichier xib
comme suit:
self.collectionView.register(UINib(nibName: HCollectionReusableView.nibName, bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: HCollectionReusableView.reuseIdentifier)
et après cela dans viewForSupplementaryElementOfKind
j'ai fait
let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: HCollectionReusableView.reuseIdentifier, for: indexPath) as! HCollectionReusableView
et pour le dimensionnement
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
return CGSize(width: 100, height: 50)
}
Je reçois une erreur: impossible de charger la carte NIB dans le paquet . Aucun code manquant?
Classe HCollectionReusableView:
class HCollectionReusableView: UICollectionReusableView {
static var nibName : String
{
get { return "headerNIB"}
}
static var reuseIdentifier: String
{
get { return "headerCell"}
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
}
Vous devez appeler viewForSupplementaryElementOfKind
comme ceci:
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")
}
}
De cette façon, vous pouvez initialiser et afficher l'en-tête
Une autre façon de définir le cadre UICollectionViewHeader consiste à étendre UICollectionViewDelegateFlowLayout
comme ceci:
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
}
}
Cela supprime le besoin d'appeler:
reusableview.frame = CGRect(0 , 0, self.view.frame.width, headerHight)
dans ce qui précède
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView
N'oubliez pas d'enregistrer le HeaderView après avoir initialisé votre
UICollectionView
en appelant:
collectionView.register(UINib(nibName: HCollectionReusableView.nibName, bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "HCollectionReusableView")
Mise à jour Swift 4.1
UICollectionElementKindSectionHeader
a été renommé en UICollectionView.elementKindSectionHeader