[예제] Collection View

J.Noma·2022년 1월 25일
0

CollectionView
Collection View

CompositionalLayout + DiffableDataSource

List

class ListCollectionViewController: UIViewController {
    private var collectionView: UICollectionView!
    private var dataSource: UICollectionViewDiffableDataSource<Section, Product>!

    override func viewDidLoad() {
        super.viewDidLoad()
        createCollectionView()
        createDataSource()
    }
}

//MARK: - CollectionView
extension ListCollectionViewController {

    private func createCollectionView() {
        let layout =  UICollectionViewCompositionalLayout { (section, layoutEnvironment) in
            let appearance = UICollectionLayoutListConfiguration.Appearance.plain
            let configuration = UICollectionLayoutListConfiguration(appearance: appearance)
            
            return NSCollectionLayoutSection.list(using: configuration,
                                                  layoutEnvironment: layoutEnvironment)
        }
        
        collectionView = UICollectionView(frame: view.frame, collectionViewLayout: layout)
    }
}

//MARK: - Data Source
extension ListCollectionViewController {

    private func createDataSource() {
        let cellRegistration = UICollectionView.CellRegistration<CollectionViewListCell, Product> {
            (cell, indexPath, item) in
        }
      
        dataSource = UICollectionViewDiffableDataSource<Section, Product>(collectionView: collectionView) {
            (collectionView, indexPath, item) -> UICollectionViewCell? in
            let cell = collectionView.dequeueConfiguredReusableCell(
                using: cellRegistration,
                for: indexPath,
                item: item
            )
            
            ...
            
            return cell
        }
    }
}

//MARK: - Snapshot
extension ListCollectionViewController {
    func applySnapShot(products: [Product]) {
        var snapshot = NSDiffableDataSourceSnapshot<Section, Product>()
        snapshot.appendSections([.main])
        snapshot.appendItems(products)
        self.dataSource.apply(snapshot, animatingDifferences: false)
    }
}

Grid

class GridCollectionViewController: UIViewController {
    private var collectionView: UICollectionView!
    private var dataSource: UICollectionViewDiffableDataSource<Section, Product>!

    override func viewDidLoad() {
        super.viewDidLoad()
        createCollectionView()
        createDataSource()
    }
}

//MARK: - CollectionView
extension GridCollectionViewController {

    private func createCollectionView() {
        let itemSize = NSCollectionLayoutSize(
            widthDimension: .fractionalWidth(1.0),
            heightDimension: .estimated(LayoutAttribute.estimatedHeight)
        )
        let item = NSCollectionLayoutItem(layoutSize: itemSize)
        
        let groupSize = NSCollectionLayoutSize(
            widthDimension: .fractionalWidth(1.0),
            heightDimension: .estimated(LayoutAttribute.estimatedHeight)
        )
        let group = NSCollectionLayoutGroup.horizontal(
            layoutSize: groupSize,
            subitem: item,
            count: LayoutAttribute.itemsPerGroup
        )
        group.interItemSpacing = .fixed(LayoutAttribute.largeSpacing)
        
        let section = NSCollectionLayoutSection(group: group)
        section.interGroupSpacing = LayoutAttribute.largeSpacing
        section.contentInsets.leading = LayoutAttribute.smallSpacing
        section.contentInsets.trailing = LayoutAttribute.smallSpacing
        
        let layout = UICollectionViewCompositionalLayout(section: section)
        
        collectionView = UICollectionView(frame: view.frame, collectionViewLayout: layout)
    }
}

//MARK: - Data Source
extension GridCollectionViewController {

    private func createDataSource() {
        let cellRegistration = UICollectionView.CellRegistration<CollectionViewGridCell, Product> {
            (cell, indexPath, item) in
        }
      
        dataSource = UICollectionViewDiffableDataSource<Section, Product>(collectionView: collectionView) {
            (collectionView, indexPath, item) -> UICollectionViewCell? in
            let cell = collectionView.dequeueConfiguredReusableCell(
                using: cellRegistration,
                for: indexPath,
                item: item
            )
            
            ...
            
            return cell
        }
    }
}

//MARK: - Snapshot
extension ListCollectionViewController {
    func applySnapShot(products: [Product]) {
        var snapshot = NSDiffableDataSourceSnapshot<Section, Product>()
        snapshot.appendSections([.main])
        snapshot.appendItems(products)
        self.dataSource.apply(snapshot, animatingDifferences: false)
    }
}
profile
노션으로 이사갑니다 https://tungsten-run-778.notion.site/Study-Archive-98e51c3793684d428070695d5722d1fe

0개의 댓글