(BusinessViewTableHeader:UIView)をtableViewヘッダーとして配置します。
tableView.tableHeaderView = BusinessViewTableHeader.instanceFromNib() as! BusinessViewTableHeader
BusinessViewTableHeader内には、Tinderアプリのように、スワイプしたときに画像を表示するはずのUICollectionViewがあります。
これは私のUIViewサブクラスです:
class BusinessViewTableHeader: UIView {
@IBOutlet var collectionView: UICollectionView!
override func awakeFromNib() {
super.awakeFromNib()
self.collectionView.delegate = self
self.collectionView.registerNib(UINib(nibName: "BusinessImageCollectionCell", bundle: nil), forCellWithReuseIdentifier: "BusinessImageCollectionCell")
}
class func instanceFromNib() -> UIView {
return UINib(nibName: "BusinessViewTableHeader", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView
}
....
}
extension BusinessViewTableHeader: UICollectionViewDelegate, UICollectionViewDataSource {
....
}
UICollectionViewを含むカスタムUIView xibがあります。問題は、UICollectionViewにセル(アイテム)を追加できないことです。 UIViewController内に配置されている他のUICollectionViewに項目を追加できます。最初の画像はUIViewController内のUICollectionViewのプロパティを示し、2番目の画像はUIView xib内のUICollectionViewを示しています。
[2
UIView xib内のUICollectionViewにアイテムを追加できないのはなぜですか?これを行う方法はありますか?
UICollectionViewがNib上にある場合、UICollectionViewCellを使用できません。必要なことは、UICollectionViewCellを別のnibとして作成し、CollectionViewに使用しているクラスに登録することです。
新しいnibを作成し、その中にUICollectionViewCellをドラッグして、UICollectionViewで機能するクラスで次のようにします。
override func awakeFromNib() {
let nibName = UINib(nibName: "ClassCollectionCell", bundle:nil)
collectionView.registerNib(nibName, forCellWithReuseIdentifier: "collectionCell")
}
カスタムクラスをUICollectionViewCellに追加して、動的データをそれに渡すことができることを忘れないでください。
Xibへのセルの追加はサポートされていません。 xibファイルを使用する必要がある場合は、UICollectionViewセルを含む個別のxibが必要になります。ストーリーボードの方が良いソリューションかもしれません。
何を達成しようとしているのか明確ではありません。 UICollectionViewには、データソースとデリゲートを使用するヘッダーを作成するための特定の手段があります。コレクションビューは、アイテムをグリッドレイアウトまたはその他の複雑な配置で表示するのに適しています。
行のリストを表示することだけが必要な場合は、UITableViewControllerがより簡単な代替手段になる可能性があります。
いずれにせよ、サブビューよりも、xibの代わりにストーリーボードを使用し、UICollectionViewControllerまたはUITableViewControllerをサブクラス化する方がおそらく良いでしょう。
カスタムクラス名は、UIViewControllerまたはUIViewのIDインスペクターに入力できます。
Swift 3. nibを次の方法で登録します-
let nibName = UINib(nibName: "FruitCell", bundle:nil)
collectionView.register(nibName, forCellWithReuseIdentifier: "CellIdentifier")
In Swift 3.
最初にUIViewのXibfileを作成します
import UIKit
class SubCatagoryListView:UIView , UICollectionViewDelegate , UICollectionViewDataSource
{
@IBOutlet weak var mainView: UIView!
@IBOutlet weak var btnClose: UIButton!
@IBOutlet weak var subCategoryListCollectionView: UICollectionView!
@IBOutlet weak var lblTitle: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
subCategoryListCollectionView.register(UINib(nibName: "SubcatagoryListCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "SubcatagoryListCollectionViewCell")
mainView.layer.cornerRadius = 10.0
mainView.clipsToBounds = true
}
static func subCatagoryListView() -> SubCatagoryListView? {
let arr = Bundle.main.loadNibNamed("SubCatagoryListView", owner: self, options: nil)
if arr != nil {
if arr!.count > 0 {
if let view = arr![0] as? SubCatagoryListView {
return view;
}
}
}
return nil;
}
@IBAction func btnBackgroundTapped(_ sender: UIButton)
{
self.removeFromSuperview()
}
@IBAction func btnCloseTapped(_ sender: UIButton)
{
self.removeFromSuperview()
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SubcatagoryListCollectionViewCell", for: indexPath) as! SubcatagoryListCollectionViewCell
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: IndexPath) -> CGSize {
let cellsize = CGSize(width: (subCategoryListCollectionView.bounds.size.width/3) - 10, height: 50)
return cellsize
}
}
新しいCollectionViewCell Xibファイルを作成した後
import UIKit
class SubcatagoryListCollectionViewCell: UICollectionViewCell {
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
}
両方のファイルを作成した後、storybordにxibをロードします
var subcatagoryXib:SubCatagoryListView?
override func awakeFromNib() {
super.awakeFromNib()
if let subcategoryView = SubCatagoryListView.subCatagoryListView()
{
subcatagoryXib = subcategoryView
}
}
@IBAction func btnAddInterestTapped(_ sender: UIButton) {
if subcatagoryXib != nil
{
self.subcatagoryXib!.frame = CGRect(x:0, y: 0, width: self.view.frame.width , height: self.view.frame.height)
self.view.addSubview(self.subcatagoryXib!)
}
}
@Patoの回答と同じですが、これはMediumの@aestusLabsによる_how to add a customized UICollectionViewCell inside a Xib file
_のより完全なチュートリアルです。 3〜5分のリーディングですが、個人的にはとても役に立ちます。基本的に、.xibを使用して別のカスタマイズされたUICollectionViewCellを作成し、それを「レベル1」セルのawakeFromNib()
に登録するように指示します。