wake-up-neo.net

iOS; programmgesteuert collectionView mit benutzerdefinierten Kopfzeilen

Ich mache eine iOS-App in Swift und versuche, eine collectionView programmgesteuert zu erstellen ..__ Ich möchte meine eigene Unterklasse von UICollectionReusableView als Header für die collectionview verwenden, da ich einige Schaltflächen und ein strechbares Bild in benötigen die Kopfzeile.

SupView ist die 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)
}

Ich versuche, die Ergänzungsansicht wie folgt in viewForSupplementaryElementOfKind einzufügen. Beim Erstellen der Kopfzeile wird jedoch eine Fehlermeldung angezeigt:

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!
}

Der Fehler ist in let headerView = ... und sagt: "signal SIGABRT"

Wie muss ich die Kopfübersicht initialisieren, damit ich sie in mein Flowlayout eingeben kann? vielleicht irgendwo mit 

collectionView.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "headerCell")

aber wenn ich versuche, die SupView-Klasse zu registrieren, gibt es einen Fehler: 

.../collectionViewPlay/ViewController.Swift: 32: 24: 'registerClass' kann nicht mit einer Argumentliste des Typs 'aufgerufen werden (SupView !, forSupplementaryViewOfKind: String, withReuseIdentifier: String)'

Irgendwelche Ideen?

BEARBEITEN:

Die Implementierung der Unterklasse wurde beantragt:

    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")
    }

}
13
Wiingaard

Also fand ich es heraus, mit Inspiration von Mohamad Farhand.

Das Problem war, dass ich die Unterklasse selbst mit dem collectionView registrieren musste, anstelle von UICollectionReusableView.self verwendete ich die Instanz der Unterklasse someView.

collectionView.registerClass(SupView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader , withReuseIdentifier: "someRandonIdentifierString")

Und wie man die Ansicht initialisiert:

someView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "someRandonIdentifierString", forIndexPath: indexPath) as! SupView
16
Wiingaard

Beachten Sie, dass Swift 4.1 die ofKind: - Konstante in UICollectionView.elementKindSectionHeader umbenennt.

3
JonJ

sie können es so machen:

 // Setup Header
 self.collectionView?.registerClass(CollectionCustomHeader.self, forSupplementaryViewOfKind: CustomeHeaderHeader, withReuseIdentifier: "customHeader")

EBENFALLS

 override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {

    if kind == CustomeHeaderHeader {
        let view = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "parallaxHeader", forIndexPath: indexPath)
        return view
    }
1
Mo Farhand

Hier ist eine Swift 3 & 4 Antwort, die ich in einem Projekt verwendet habe

self.collectionView.register(LibraryHeaderNib.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader , withReuseIdentifier: "LibraryHeaderNib")

und innerhalb viewForSupplementaryElementOfKind

let reusableView = self.collectionView!.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "LibraryHeaderNib", for: indexPath) as! LibraryHeaderNib

return reusableView
0
Niall Kiddle