[swift] Swift IGListKit을 사용한 컬렉션 뷰 구현하기

IGListKit은 iOS 앱에서 컬렉션 뷰를 구현하는 데 도움이 되는 강력한 프레임워크입니다. IGListKit은 데이터 소스와 컨테이너를 분리함으로써 유연한 아이템 기반 컬렉션 뷰를 구현할 수 있게 도와줍니다. 이번 글에서는 IGListKit을 사용하여 컬렉션 뷰를 만들어보겠습니다.

IGListKit 설치하기

먼저, IGListKit을 프로젝트에 설치해야 합니다. IGListKit은 CocoaPods를 통해 설치할 수 있습니다. Podfile에 다음과 같이 IGListKit을 추가해주세요.

target 'YourApp' do
  pod 'IGListKit'
end

그리고 터미널에서 pod install 명령어를 실행하여 IGListKit을 프로젝트에 추가합니다.

데이터 소스 구현하기

데이터 소스는 IGListKit에서 컬렉션 뷰의 데이터를 제공하는 역할을 합니다. 먼저 ListDiffable 프로토콜을 채택하여 아이템이 컬렉션 뷰에 어떻게 표시될지를 정의합니다.

struct Item: ListDiffable {
    let id: Int
    let title: String
    
    func diffIdentifier() -> NSObjectProtocol {
        return id as NSObjectProtocol
    }
    
    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
        guard let object = object as? Item else { return false }
        return title == object.title
    }
}

다음으로, IGListAdapterDataSource 프로토콜을 채택하여 데이터 소스를 구현합니다.

class DataSource: NSObject, IGListAdapterDataSource {
    var items: [Item] = []
    
    func objects(for listAdapter: IGListAdapter) -> [IGListDiffable] {
        return items
    }
    
    func listAdapter(_ listAdapter: IGListAdapter, sectionControllerFor object: Any) -> IGListSectionController {
        return MySectionController()
    }
    
    func emptyView(for listAdapter: IGListAdapter) -> UIView? {
        return nil
    }
}

위의 코드에서 objects(for:) 메서드에서는 컬렉션 뷰에 표시될 아이템 배열을 반환합니다. listAdapter(_:sectionControllerFor:) 메서드에서는 각 아이템을 표시할 섹션 컨트롤러를 반환합니다. 마지막으로, emptyView(for:) 메서드에서는 컬렉션 뷰에 표시될 내용이 없을 때 표시할 뷰를 반환합니다.

섹션 컨트롤러 구현하기

섹션 컨트롤러는 데이터 소스에서 제공된 아이템을 컬렉션 뷰에 표시하는 역할을 합니다. 섹션 컨트롤러를 구현하기 위해 IGListSectionController 클래스를 상속받아 구현합니다.

class MySectionController: IGListSectionController {
    var item: Item?
    
    override func sizeForItem(at index: Int) -> CGSize {
        guard let context = collectionContext else { return .zero }
        let width = context.containerSize.width
        let height: CGFloat = 50
        return CGSize(width: width, height: height)
    }
    
    override func cellForItem(at index: Int) -> UICollectionViewCell {
        let cell = collectionContext?.dequeueReusableCell(of: MyCell.self, for: self, at: index) as! MyCell
        cell.titleLabel.text = item?.title
        return cell
    }
    
    override func didUpdate(to object: Any) {
        item = object as? Item
    }
}

위의 코드에서 sizeForItem(at:) 메서드에서는 각 아이템의 크기를 반환합니다. cellForItem(at:) 메서드에서는 각 아이템에 해당하는 셀을 반환하고 데이터를 표시합니다. didUpdate(to:) 메서드에서는 섹션 컨트롤러에 아이템이 전달될 때 호출되며, 이를 통해 섹션 컨트롤러가 데이터를 업데이트할 수 있습니다.

컬렉션 뷰 설정하기

마지막으로, 컬렉션 뷰를 설정해야 합니다. 먼저, IGListAdapter 인스턴스를 만들고 데이터 소스와 뷰 컨트롤러를 연결합니다.

class ViewController: UIViewController {
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
    let dataSource = DataSource()
    lazy var adapter: IGListAdapter = {
        return IGListAdapter(updater: IGListAdapterUpdater(), viewController: self)
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        adapter.collectionView = collectionView
        adapter.dataSource = dataSource
        
        // 컬렉션 뷰 속성 설정
        collectionView.backgroundColor = .white
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.contentInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        collectionView.alwaysBounceVertical = true
        
        view.addSubview(collectionView)
        NSLayoutConstraint.activate([
            collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            collectionView.topAnchor.constraint(equalTo: view.topAnchor),
            collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
        ])
    }
}

위의 코드에서 lazy 키워드를 사용하여 adapter 프로퍼티를 지연 생성하고, IGListAdapter 인스턴스를 초기화합니다. 그리고 collectionViewdataSourceadapter에 설정합니다. 마지막으로, 컬렉션 뷰의 속성을 설정하고 뷰에 추가합니다.

결론

이제 IGListKit을 사용하여 컬렉션 뷰를 구현하는 방법을 알아보았습니다. IGListKit은 데이터 소스와 컨테이너를 분리하여 유연하고 재사용 가능한 컬렉션 뷰를 만들 수 있게 해줍니다. IGListKit은 iOS 앱에서 복잡한 컬렉션 뷰를 관리하기에 매우 효과적인 도구입니다.