在UICollectionViewCell中的UICollectionView

我有兴趣有一个collectionview作为一个集合视图单元格的一部分,但由于某种原因无法弄清楚如何做到这一点。 我将在哪里实施细胞collectionview的必要的方法?

有一篇Ash UICollectionView 写的文章解释了如何在UITableViewCell放置一个UICollectionView 。 在UICollectionViewCell使用它基本上是一样的想法。

一切都以编程方式完成。 没有故事板。

我在我的UICollectionViewCell中添加了一个UICollectionView。 我也展示了如何在创build的UICollectionView中再次添加一个UICollectionViewCell来获得这个结果

在这里输入图像说明

 import UIKit class CategoryCell: UICollectionViewCell, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { private let cellId = "cell" override init(frame: CGRect) { super.init(frame: frame) setupViews() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } let appsCollectionView: UICollectionView = { let layout = UICollectionViewFlowLayout() let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) return collectionView }() func setupViews() { backgroundColor = .blue addSubview(appsCollectionView) appsCollectionView.delegate = self appsCollectionView.dataSource = self appsCollectionView.register(AppCell.self, forCellWithReuseIdentifier: cellId) addConstrainstWithFormat("H:|-8-[v0]-8-|", views: appsCollectionView) addConstrainstWithFormat("V:|[v0]|", views: appsCollectionView) } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 5 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) return cell } } class AppCell: UICollectionViewCell { override init(frame: CGRect) { super.init(frame: frame) setupViews() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } func setupViews(){ backgroundColor = .red } } 

我的UICollectionViewController

 import UIKit class FeaturedAppsController: UICollectionViewController, UICollectionViewDelegateFlowLayout { let cellId = "cell" override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. collectionView?.backgroundColor = .white collectionView?.register(CategoryCell.self, forCellWithReuseIdentifier: cellId) } override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 3 } override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) return cell } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(view.frame.width, 150) } } 

整个解释可以find,并由“让我们build立该应用程序”开发: https : //www.youtube.com/watch?v= Ko9oNhlTwH0&list=PL0dzCUj1L5JEXct3-OV6itP7Kz3tRDmma

对于这个答案来说,这太迟了,但它可能会帮助其他人。 这是UICollectionView一个UICollectionViewCell

让我们开始有一个mainCollectionView 。 然后在这个集合的每个单元格上创build并初始化一个新的UICollectionView然后在这个下面的UICollectionView

func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath)

例如我在这里初始化MainCollectionViewCell ,然后MainCollectionViewCell处理逻辑来创build一个新的UICollectionView

 guard let collectionViewCell = cell as? MainCollectionViewCell else { return } collectionViewCell.delegate = self let dataProvider = ChildCollectionViewDataSource() dataProvider.data = data[indexPath.row] as NSArray let delegate = ChildCollectionViewDelegate() collectionViewCell.initializeCollectionViewWithDataSource(dataProvider, delegate: delegate, forRow: indexPath.row) collectionViewCell.collectionViewOffset = storedOffsets[indexPath.row] ?? 0 

这是MainCollectionViewCell上的初始化器,它创build一个新的UICollectionView

 func initializeCollectionViewWithDataSource<D: protocol<UICollectionViewDataSource>,E: protocol<UICollectionViewDelegate>>(dataSource: D, delegate :E, forRow row: Int) { self.collectionViewDataSource = dataSource self.collectionViewDelegate = delegate let flowLayout = UICollectionViewFlowLayout() flowLayout.scrollDirection = .Horizontal let collectionView = UICollectionView(frame: self.bounds, collectionViewLayout: flowLayout) collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseChildCollectionViewCellIdentifier) collectionView.backgroundColor = UIColor.whiteColor() collectionView.dataSource = self.collectionViewDataSource collectionView.delegate = self.collectionViewDelegate collectionView.tag = row self.addSubview(collectionView) self.collectionView = collectionView collectionView.reloadData() } 

希望帮助!

我为此做了一个例子,并放在github上。 它演示了在UICollectionViewCell使用UICollectionViewCell

https://github.com/irfanlone/Collection-View-in-a-collection-view-cell