2017-02-13 9 views
3

J'essaie d'ajouter l'en-tête à collectionView en utilisant le fichier xib personnalisé. J'ai créé le fichier xib avec la classe implémentant UICollectionReusableView. Dans collectionViewController J'enregistré le fichier xib comme ceci:ajouter un en-tête personnalisé à la vue de la collection swift

self.collectionView.register(UINib(nibName: HCollectionReusableView.nibName, bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: HCollectionReusableView.reuseIdentifier) 

et après que 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) 
} 

J'obtiens l'erreur: Impossible de charger NIB en bundle. un 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 
} 

}

Répondre

6

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 montrer l'en-tête

Une autre façon de fixer le cadre UICollectionViewHeader est en étendant UICollectionViewDelegateFlowLayout comme celui-ci :

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 la nécessité d'appeler:

reusableview.frame = CGRect(0 , 0, self.view.frame.width, headerHight) 

dans mentionnées ci-dessus 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")

+0

Je pense que je dois changer l'enregistrement de xib en classe, ici l'erreur maintenant: impossible de déquiler une vue de type: UICollectionElementKindSectionHeader avec l'identifiant HCollectionReusableView - doit enregistrer une plume ou une classe pour le identifier ou connecter une cellule prototype dans un storyboard (null) –

+1

vous obtenez l'erreur depuis les identificateurs lorsque vous enregistrez l'élément et lorsque vous vous enregistrez ne correspondent pas ... essayez de coder en dur l'identifiant comme ceci lorsque vous enregistrez la cellule: 'self.collectionView.register (UINib (nibName: HCollectionReusableView.nibName, bundle: nil), pourSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier:" HCollectionReusableView ") ' cela devrait fonctionner ... alors vous pouvez simplement ajuster le code pour répondre à vos besoins – John

+0

vous n'enregistrerez la classe que si vous n'utilisez aucun Xib ou Storyboard – John

0

Avez-vous défini dans le fichier » paramètre propriétaire dans votre fichier xib? Modifiez le propriétaire du fichier sur votre contrôleur View hébergeant collectionView.

enter image description here

+0

oui je l'ai fait, dans le propriétaire du fichier et dans la collection vue réutilisable –