web-dev-qa-db-ja.com

iOS;プログラムでカスタムヘッダーを含むuicollectionView

私はSwiftでiOSアプリを作成していますが、collectionViewをプログラムで作成しようとしています。 UICollectionReusableViewの独自のサブクラスをcollectionviewのヘッダーとして使用したいのは、ヘッダーにいくつかのボタンと伸縮可能な画像が必要だからです。

SupViewは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)
}

次のように、補足ビューをviewForSupplementaryElementOfKindに挿入しようとしていますが、ヘッダーを作成しようとするとエラーが発生します。

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

エラーはlet headerView = ...そして言う:「シグナルSIGABRT」

ヘッダービューをどのように初期化する必要がありますので、フローレイアウトに入力できますか?

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

しかし、SupViewクラスを登録しようとすると、エラーが発生します。

.../collectionViewPlay/ViewController.Swift:32:24:タイプ「(SupView !, forSupplementaryViewOfKind:String、withReuseIdentifier:String)」の引数リストで「registerClass」を呼び出すことはできません

何か案は?

編集:

サブクラスの実装が要求されました:

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

}
16
Wiingaard

だから私は、Mohamad Farhandからインスピレーションを得て、それを理解しました。

問題は、UICollectionReusableView.selfの代わりにサブクラス自体をcollectionViewに登録しなければならなかったことで、サブクラスsomeViewのインスタンスを使用しました。これで問題が解決しました。

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

そして、ビューを初期化する方法:

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

Swift 4.1はofKind:定数の名前をUICollectionView.elementKindSectionHeaderに変更します。

8
JonJ

このようにすることができます:

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

また

 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
    }
2
Mo Farhand

Swift 3&4私がプロジェクトで使用した答えです

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

およびviewForSupplementaryElementOfKindの中

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

return reusableView
0
Niall Kiddle