2013-07-18 20 views
8

Sono interessato ad avere una vista raccolta come parte di una cella di visualizzazione della raccolta, ma per qualche motivo non riesco a capire come questo sarebbe stato fatto. Dove implementerei i metodi necessari per la visualizzazione delle celle?UICollectionView in a UICollectionViewCell

risposta

11

C'è an article that Ash Furrow wrote che spiega come inserire un UICollectionView all'interno di uno UITableViewCell. È fondamentalmente la stessa idea quando lo si utilizza all'interno di un UICollectionViewCell.

1

Questo è troppo tardi per questa risposta, ma potrebbe aiutare gli altri. Questo è un esempio di UICollectionView all'interno di UICollectionViewCell.

Iniziamo con un mainCollectionView. Poi su ogni cella di questa collezione creare e inizializzare una nuova UICollectionView e proprio luogo per farlo è in questo seguito delegato di UICollectionView

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

ad esempio, ho inizializzare il MainCollectionViewCell qui e poi MainCollectionViewCell gestisce la logica di creare un nuova 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 

Ecco l'inizializzatore su MainCollectionViewCell che crea una nuova 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() 
} 

Spero che questo aiuti !!

Ho fatto un esempio per questo e inserito in github. Dimostra l'uso di UICollectionView all'interno di UICollectionViewCell.

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

2

Tutto è fatto programatically. Nessuno storyboard.

Ho aggiunto un UICollectionView all'interno del mio UICollectionViewCell. Mostro anche come aggiungere di nuovo un UICollectionViewCell all'interno del UICollectionView creato per avere questo risultato

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

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

} 

Tutta la spiegazione può essere trovata ed è stato sviluppato da "Let Costruisci quell'app ": https://www.youtube.com/watch?v=Ko9oNhlTwH0&list=PL0dzCUj1L5JEXct3-OV6itP7Kz3tRDmma

Problemi correlati