강의를 통해 UICollectionView
의 CompositionalLayout
을 처음 사용해봤다.
NSCollectionLayoutItem
, NSCollectionLayoutGroup
, NSCollectionLayoutSection
같은 개념들을 활용해 레이아웃을 세밀하게 조정하여 UICollectionView의 레이아웃을 훨씬 유연하고 직관적으로 구성할 수 있게 도와준다.
코드 예제와 함께 이번에 배운 내용들을 정리해두도록 하자.
위와 같이 Section
, Header
, Footer
, Group
, Item
등으로 이루어져 있다.
NSCollectionLayoutItem
- 아이템의 크기 설정먼저, NSCollectionLayoutItem
을 사용해 각 아이템의 크기를 설정한다.
아이템의 크기는 NSCollectionLayoutSize
를 사용해 설정하며, fractionalWidth
와 fractionalHeight
를 이용해 부모의 크기 대비 비율로 지정할 수 있다.
let itemSize = NSCollectionLayoutSize(
widthDimension: .fractionalWidth(1.0),
heightDimension: .fractionalHeight(1.0)
)
let item = NSCollectionLayoutItem(layoutSize: itemSize)
fractionalWidth(1.0)
과 fractionalHeight(1.0)
은 부모의 크기에 대해 아이템이 전체를 차지한다는 의미이다.NSCollectionLayoutGroup
- 그룹의 크기 및 방향 설정다음으로, NSCollectionLayoutGroup
을 사용해 아이템들을 포함하는 그룹을 구성한다.
그룹의 크기도 NSCollectionLayoutSize
로 지정하고, 그룹 내 아이템의 배치를 수평 또는 수직으로 설정할 수 있다.
let groupSize = NSCollectionLayoutSize(
widthDimension: .fractionalWidth(0.25),
heightDimension: .fractionalHeight(0.4)
)
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
horizontal
을 사용해 아이템들이 수평으로 배치되도록 했다.NSCollectionLayoutSection
- 섹션 구성 및 스크롤 설정그룹을 섹션에 추가한 다음, 섹션의 스크롤 방식과 간격을 설정한다.
NSCollectionLayoutSection
은 레이아웃의 전반적인 구조를 정의하는 역할을 한다.
let section = NSCollectionLayoutSection(group: group)
section.orthogonalScrollingBehavior = .continuous
section.interGroupSpacing = 10
section.contentInsets = .init(top: 10, leading: 10, bottom: 20, trailing: 10)
orthogonalScrollingBehavior
를 .continuous
로 설정해 수평 스크롤이 연속적으로 이루어지도록 했다.interGroupSpacing
을 사용해 그룹 간의 간격을 10포인트로 설정했다.contentInsets
로 섹션의 패딩을 설정해 레이아웃의 가장자리와 여백을 줬다.NSCollectionLayoutBoundarySupplementaryItem
- 헤더 추가하기섹션에 헤더를 추가할 때는 NSCollectionLayoutBoundarySupplementaryItem
을 사용한다.
let headerSize = NSCollectionLayoutSize(
widthDimension: .fractionalWidth(1),
heightDimension: .estimated(44)
)
let header = NSCollectionLayoutBoundarySupplementaryItem(
layoutSize: headerSize,
elementKind: UICollectionView.elementKindSectionHeader,
alignment: .top
)
section.boundarySupplementaryItems = [header]
elementKindSectionHeader
를 사용해 섹션 헤더로 정의했다.boundarySupplementaryItems
에 헤더를 추가해준다.