![]() | ![]() |
UICollectionViewCompositionalLayout는 섹션(Section)마다 완전히 다른 레이아웃을 조합(Composition)해서 만들 수 있는 레이아웃 시스템이다.
상단의 예매 화면처럼 섹션마다 UI 형태가 다르게 만들 수 있다.
private func makeLayout() -> UICollectionViewLayout {
UICollectionViewCompositionalLayout { sectionIndex, environment in
switch sectionIndex {
case 0: return self.make2x2GirdSection(environment: environment)
case 1: return self.makeHorizontalScrollSection(environment: environment)
case 2: return self.make3x2GirdSection(environment: environment)
case 3: return self.makeListSection(environment: environment)
default: return self.makeBookingSection(environment: environment)
}
}
}
make2x2GirdSection(environment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection 이런식으로 environment 받고 NSCollectionLayoutSection을 반환하는 함수를 만든다.let spacing: CGFloat = 10
let containerSize = environment.container.effectiveContentSize
let itemWidthSize = (containerSize.width - spacing * 3) / 2
let itemHeightSize = itemWidthSize / 2
// 아이템 사이즈 지정
let item = NSCollectionLayoutItem(layoutSize: itemSize)
// 가로 한줄 구성
let rowGroup = NSCollectionLayoutGroup.horizontal(
layoutSize: NSCollectionLayoutSize(
widthDimension: .absolute(itemWidthSize * 2),
heightDimension: .absolute(50)
),
repeatingSubitem: item,
count: 2
)
rowGroup.interItemSpacing = .fixed(spacing)
// 2번 쌓기
let gridGroup = NSCollectionLayoutGroup.vertical(
layoutSize:NSCollectionLayoutSize(
widthDimension: .absolute(itemWidthSize * 2),
heightDimension: .absolute(100)
),
repeatingSubitem: rowGroup,
count: 2
)
gridGroup.interItemSpacing = .fixed(spacing)
let section = NSCollectionLayoutSection(group: gridGroup)
section.interGroupSpacing = spacing
section.contentInsets = .init(top: spacing, leading: spacing, bottom: spacing, trailing: spacing)
section.boundarySupplementaryItems = [makeHeaderItem(height: 60)]
return section
section.orthogonalScrollingBehavior = .continuouslet containerSize = environment.container.effectiveContentSize
let itemWidthSize = (containerSize.width - spacing * 4) / 3
let containerSize = environment.container.effectiveContentSize
let itemWidthSize = (containerSize.width - spacing * 2)