web-dev-qa-db-fra.com

ajouter un en-tête personnalisé à uicollectionview swift

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
}

}

5
Khaled Hayek

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

21
John

Avez-vous défini le paramètre File 'Owner dans votre fichier xib? Changez le propriétaire du fichier sur votre collection View Controller.

 enter image description here

0
Nguyễn Anh Việt