私は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")
}
}
だから私は、Mohamad Farhandからインスピレーションを得て、それを理解しました。
問題は、UICollectionReusableView.self
の代わりにサブクラス自体をcollectionViewに登録しなければならなかったことで、サブクラスsomeView
のインスタンスを使用しました。これで問題が解決しました。
collectionView.registerClass(SupView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader , withReuseIdentifier: "someRandonIdentifierString")
そして、ビューを初期化する方法:
someView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "someRandonIdentifierString", forIndexPath: indexPath) as! SupView
Swift 4.1はofKind:定数の名前をUICollectionView.elementKindSectionHeader
に変更します。
このようにすることができます:
// 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
}
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