UICollectionViewFlowLayout
는 UICollectionViewLayout
의 유형 중 하나이며, 각 cell
의 배치를 자세하게 나타내어 설정해줄 수 있다. cell
은 한 행 또는 열(스크롤 방향에 따라 다름)에서 다음으로 흐르듯이 배치되며, 각 행에는 최대한 많은 cell
이 포함된다. 그래서 FlowLayout
이라고 불리는 듯 하다.
collectionView 프로퍼티를 설정한다.
private lazy var collectionView: UICollectionView = {
let flowLayout = UICollectionViewFlowLayout()
flowLayout.itemSize = CGSize(width: 60, height: 60) // cell의 크기를 60x60으로 설정
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
collectionView.dataSource = self
collectionView.register(FlowLayoutPracticeCell.self, forCellWithReuseIdentifier: FlowLayoutPracticeCell.id)
return collectionView
}()
위 코드처럼 itemSize를 설정하면 cell의 크기가 바뀐다.
flowLayout.itemSize = CGSize(width: 60, height: 60) // cell의 크기를 60x60으로 설정
item
사이의 최소 간격을 설정할 수 있다.
flowLayout.minimumInteritemSpacing = 4
전 | 후 |
---|---|
아까와 다르게 간격이 좁아져 더 많은 셀이 보이게 되었다.
각 라인의 최소 간격을 설정할 수 있다. 한 라인에 해당하는 item
의 사이즈가 다를 수 있기에, 라인별 가장 큰 Item 크기를 기준으로 최소 간격이 정해진다.
flowLayout.minimumLineSpacing = 30
전 | 후 |
---|---|
item
을 갖는 컨테이너인 Content
에 Margin을 설정하여 위치조절을 할 수 있다.
flowLayout.sectionInset = UIEdgeInsets(top: 60, left: 60, bottom: 60, right: 60)
전 | 후 |
---|---|
외부 마진이 생겨서 보이는 cell의 개수가 줄어들었다.
collectionView.delegate = self
extension FlowLayoutPracticeVC: UICollectionViewDelegateFlowLayout {
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 10 * Int.random(in: 5...10), height: 10 * Int.random(in: 5...10))
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 20
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 80
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
Reference
iOS) UICollectionView custom layout에 대한 고찰- 1 (UICollectionViewFlowLayout, UICollectionViewLayout)
Apple - Using the Flow Layout