iOS; par programme collectionView avec des en-têtes personnalisés
Je suis en train de faire une application iOS dans swift, et je suis en train de faire un collectionView par programmation.
Je veux utiliser mon propre sous-classe de UICollectionReusableView comme en-tête de la collectionview, parce que j'ai besoin de quelques boutons et un strechable image dans l'en-tête.
SupView est le UICollectionReusableView.
override func viewDidLoad() {
super.viewDidLoad()
let layout = UICollectionViewFlowLayout()
layout.headerReferenceSize = CGSizeMake(self.view.frame.width, 200)
someView = SupView(frame: CGRectMake(0, 0, view.frame.width, 200))
collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
collectionView.delegate = self
collectionView.dataSource = self
collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
collectionView.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "headerCell") //UICollectionReusableView
self.view.addSubview(collectionView)
}
J'essaie d'insérer le Complémentaire de Vue en viewForSupplementaryElementOfKind
, comme ça, mais j'obtiens une erreur lorsque vous essayez de créer l'en-tête:
func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
var reusableView : UICollectionReusableView? = nil
//Create header
if (kind == UICollectionElementKindSectionHeader) {
//Create Header
let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: "headerCell", forIndexPath: indexPath) as! SupView
headerView.frame = CGRectMake(0, 0, view.frame.width, 200)
reusableView = headerView
}
return reusableView!
}
L'erreur est dans let headerView = ...
et dit: "signal SIGABRT"
Comment dois-je initialiser le headerview, de sorte que le je à mon flowlayout? peut-être avec avec
collectionView.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "headerCell")
mais si j'essaie d'enregistrer le SupView de classe, il me donne l'erreur:
.../collectionViewPlay/ViewController.swift:32:24: Ne peut pas invoquer 'registerClass" avec une liste d'arguments de type '(SupView!, forSupplementaryViewOfKind: String, withReuseIdentifier: String)'
Des Idées?
EDIT:
La mise en œuvre de la sous-classe demandée:
import UIKit
class SupView: UICollectionReusableView {
//////////////////////////////////////////////////////////////////////////////
override init(frame: CGRect) {
super.init(frame: frame)
self.myCustomInit()
}
//////////////////////////////////////////////////////////////////////////////
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
self.myCustomInit()
}
func myCustomInit() {
print("hello there from SupView")
}
}
OriginalL'auteur Wiingaard | 2015-10-26
Vous devez vous connecter pour publier un commentaire.
J'ai donc pensé à elle, avec l'inspiration de Mohamad Farhand.
Le problème était que j'avais à vous inscrire à la sous-classe elle-même avec la collectionView, au lieu de
UICollectionReusableView.self
, j'ai utilisé l'exemple de la sous-classesomeView
.. Si cela a résolu mon problème:Et comment initialiser le point de vue:
OriginalL'auteur Wiingaard
Noter que Swift 4.1 renomme le ofKind: constante
UICollectionView.elementKindSectionHeader
.OriginalL'auteur JonJ
vous pouvez le faire comme ceci :
AUSSI
CollectionCustomHeader.self
etCustomeHeaderHeader
dans mon cas? Et ce sont les deux identificateur supposons que pour un match?OriginalL'auteur Mo Farhand
Ici est un Swift 3 & 4 de la réponse, je l'ai utilisé dans un projet
et à l'intérieur de
viewForSupplementaryElementOfKind
OriginalL'auteur Niall Kiddle