Sign In
상태
Empty
담당자
Empty
작성자
한결
작성시각
UIKit - CollectionView 가로 스크롤 UI
커머스 앱이나 배달 앱 등 비슷한 카테고리로 동일한 데이터를 좁은 View 안에서 보여주기 위해서 가로의 끝이 언제인지 알 수 없는 가로 스크롤 UI를 사용하곤 한다. iOS에서는 UICollectionView로 이런 가로 UI를 쉽게 생성할 수 있다.
// SomeViewController.swift

class SomeViewController: UIViewController {
    lazy var horizontalCollection = UICollectionView(
        frame: .zero, 
        collectionViewLayout: configureCollectionLayout()
    )

    ..

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubView(horizontalCollection)

        horizontalCollection.snp.makeConstraints { make in
            make.horizontalEdges.top.equalTo(view.safeAreaLayoutGuide)
            make.height.equalTo(300)
        }
    }

    func configureCollectionLayout() -> UICollectionViewLayout {
        let layout = UICollectionViewFlowLayout()

        let width = UIScreen.main.bounds.width * 0.6
        let height = UIScreen.main.bounds.height / 3
        layout.itemSize = CGSize(width: width, height: height)

        layout.scrollDirection = .horizontal
        layout.minimumLineSpacing = 20
        layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
  
        return layout
    }
}
•
컬랙션뷰를 구현하기 위해서는 delegate, datasource에 대한 위임, 커스텀 Item에 대한 등록 역시 필요하다. (이 부분은 테이블뷰 구현과 동일하다.)
•
Swift 자체에서 시스템 테이블로 제공하는 형식이 없다보니, 테이블뷰 구현과 다르게 컬랙션 아이템(테이블에서는 셀), 컬랙션 틀 자체에 대한 레이아웃을 랜더링 하기 전에 반드시 설정해줘야 한다.
*설정하지 않고 빌드해보면 아래와 같은 에러를 마주할 수 있다.
"UICollectionView must be initialized with a non-nil layout parameter"
•
UICollectionViewFlowLayout 클래스로 생성한 인스턴스에서 컬랙션 아이템, 틀에 대한 레이아웃을 지정할 수 있다. (내장 멤버 변수를 조정하여 설정 가능하다.)
◦
itemSize - 말 그대로 각 아이템의 사이즈를 결정해준다.
◦
scrollDirection - 당연히 스크롤 방향이다.
◦
minimumLineSpacing - 컬랙션 뷰 내부에서 아이템들 간의 간격을 결정한다.
◦
sectionInset - 컬랙션 뷰 내부의 아이템 그룹의 Edge에 대한 간격을 결정한다.
위와 같이 설정을 한다면, 아래 첨부된 영상처럼 가로 스크롤이 가능한 UI 구현이 가능하다.