2013-07-18 10 views
8

Ich bin daran interessiert, eine Collectionview als Teil einer Sammlung anzuzeigen Zelle, aber aus irgendeinem Grund kann nicht herausfinden, wie dies getan werden würde. Wo würde ich die notwendigen Methoden für die cells collectionview implementieren?UICollectionView in einem UICollectionViewCell

Antwort

11

Es gibt an article that Ash Furrow wrote, die erklärt, wie man einen UICollectionView innerhalb eines UITableViewCell setzt. Es ist im Grunde die gleiche Idee, wenn Sie es in einem UICollectionViewCell verwenden.

1

Dies ist zu spät für diese Antwort, aber es könnte anderen helfen. Dies ist ein Beispiel für UICollectionView in einem UICollectionViewCell.

Beginnen wir mit einem mainCollectionView. Dann auf jeder Zelle dieser Sammlung erstellen und initialisieren einen neuen UICollectionView und am richtigen Ort zu tun, ist, dass in diesen folgend Delegierten UICollectionView

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

zB ich die MainCollectionViewCell hier initialisieren und dann MainCollectionViewCell nimmt die Logik ein erstellen Hier werden neue 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 

ist der Initialisierer auf MainCollectionViewCell, die eine neue UICollectionView

schafft
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() 
} 

Hoffe, dass hilft !!

Ich habe ein Beispiel dafür gemacht und Github eingefügt. Es zeigt die Verwendung UICollectionView in einem UICollectionViewCell.

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

2

Alles ist programmatisch getan. Keine Storyboards

Ich habe eine UICollectionView in meiner UICollectionViewCell hinzugefügt. Ich zeige auch, wie man hinzufügen, wieder eine UICollectionViewCell innerhalb des erstellt UICollectionView dieses Ergebnis

enter image description here

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

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

} 

Die ganze Erklärung gefunden werden und wurde von entwickelt wurden, können haben „Let Die Build-App ": https://www.youtube.com/watch?v=Ko9oNhlTwH0&list=PL0dzCUj1L5JEXct3-OV6itP7Kz3tRDmma

Verwandte Themen