글 작성 기준
Xcode: Version 14.1 (14B47b)
iOS: 16.0^
Swift: 5.7.1 (5.7.1.135.3)
CollectionViewLayout
의 유형 중 하나로, 여러 복잡한 레이아웃을 보다 적은 양의 코드로 보다 정교하게 구현할 수 있도록 만든 layout
Section - Group - Item
순의 개념이 존재하며, 각 Section 별로 뷰의 배치를 다양하게 활용할 수 있다.
해당 layout
의 근본 컴포넌트이며 개별 컨텐츠의 크기, 간격, 정렬에 대한 설계도(blueprint)를 나타낸다. 일반적으로 Item
은 Cell이 되지만 Header, Footer, Decoration와 같은 SupplementaryView
도 될 수 있다.
Item
은 Group
과 결합(Combine)하여 각 항목이 서로 관련되어 정렬되는 방식을 결정한다. NSCollectionLayoutSize
로 사이즈를 설정한다.
Item
을 담는 Container 역할. 각 Item
을 가로 열, 세로 열 등 어떻게 배치할 지 결정한다. Group
은 단지 배치에 대한 정의를 내려주는 객체일 뿐, 렌더링 하지는 않는다.
NSCollectionLayoutSize
로 사이즈를 설정한다.
Group
을 담는 Container 역할을 하며, Section
을 만드는 데 사용되는 Group
의 속성에 따라 결정된다.
Section
은 고유 배경, header, footer를 가질 수 있다.
Note
: 앞서CompositionalLayout
은 세 가지 크기 조절 옵션을 제공한다.
item
의 너비와 높이를 설정한다.item
의 너비와 높이를 설정한다. item
의 컨텐츠 크기에 따라 달라진다.SuperView
의 너비를 기준으로 비율로써 크기를 설정한다.SuperView
의 높이를 기준으로 비율로써 크기를 설정한다.NSCollectionLayoutItem
타입이며, 위에 언급한 크기 옵션을 맞춰 제공해주어야한다.convenience init(layoutSize: NSCollectionLayoutSize)
1:1
비율의 사이즈로 보여주기 위해 다음의 코드를 작성한다.let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1),
heightDimension: .fractionalHeight(1))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
item.contentInsets = NSDirectionalEdgeInsets(top: 1, leading: 1, bottom: 1, trailing: 1)
// horizontal
class func horizontal(layoutSize: NSCollectionLayoutSize, repeatingSubitem subitem: NSCollectionLayoutItem, count: Int) -> Self
// vertical
class func vertical(layoutSize: NSCollectionLayoutSize, repeatingSubitem subitem: NSCollectionLayoutItem, count: Int) -> Self
let group = NSCollectionLayoutGroup.horizontal(
layoutSize: .init(widthDimension: .fractionalWidth(1/4),
heightDimension: .fractionalHeight(1/3)),
repeatingSubitem: item,
count: 4
)
let section = NSCollectionLayoutSection(group: group)
UICollectionViewCompositionalLayout(section:)
을 사용하여 앞선 section
을 주입하여 layout을 생성한다.let layout = UICollectionViewCompositionalLayout(section: section)
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
// item
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1),
heightDimension: .fractionalHeight(1))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
// group
let group = NSCollectionLayoutGroup.horizontal(
layoutSize: .init(widthDimension: .absolute(70),
heightDimension: .absolute(70)),
subitems: [item]
)
section
에서는 orthogonalScrollingBehavior
프로퍼티를 이용하여 수평스크롤을 설정할 수 있다.// section
let section = NSCollectionLayoutSection(group: group)
section.orthogonalScrollingBehavior = .continuous
section.interGroupSpacing = 10
section.contentInsets = .init(top: 0, leading: 10, bottom: 30, trailing: 10)
section.boundarySupplementaryItems = [
.init(layoutSize: .init(widthDimension: .fractionalWidth(1),
heightDimension: .estimated(50)),
elementKind: UICollectionView.elementKindSectionHeader, alignment: .top)
]
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// codes...
cell.backgroundColor = .systemGray5
cell.layer.cornerRadius = cell.frame.height / 2
cell.configure(with: String(indexPath.item)) // Custom Function
return cell
}