cell의 크기를 설정할 때 분명 inspector에서 cell size를 설정했는데도 실제로는 적용이 되지 않아 난항을 겪은 적이 있을것이다. 이는 Estimate Size의 옵션을 Automatic
으로 설정하였기 때문이다. 이 경우, cell은 주어진 제약에 맞춰 Self Sizing을 하게 된다.
Flow
이다.extension MainViewController: UICollectionViewDelegateFlowLayout{
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width = collectionView.bounds.width / 2
return CGSize(width: width, height: width)
}
}
셀 사이의 여백을 설정할 수 있다.
고정 값이 아니라, 최솟값이다. 즉, 어느 부분에서는 여백이 더 커질 수 있다.
For Cells
: 셀 사이의 여백
For Lines
: 줄 사이의 여백
만약 한 줄에 두 개의 셀을 표시하고 싶어 여백값을 사용해야 할 땐, 여백의 고정값이 아니라 직접 변수로 접근해 값을 받아오는 것이 바람직하다. 이 값은 FlowLayout의 속성에 정의되어 있다.
scrollDirection
: 콜렉션뷰의 스크롤 방향. 기본값은 verticalminimumLineSpacing
: 최소 라인 여백minimumInteritemSpacing
: 최소 셀 사이 여백extension MainViewController: UICollectionViewDelegateFlowLayout{
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
guard let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout else { return .zero }
//소수점때문에 뷰가 망가지는 경우 방지
let width = Int((collectionView.bounds.width - flowLayout.minimumInteritemSpacing) / 2)
return CGSize(width: width, height: width)
}
}
만약, section별 inset도 추가했다면
flowLayout.minimumInteritemSpacing
flowLayout.sectionInset.left
flowLayout.sectionInset.right
모두 고려해야 한다.
extension MainViewController: UICollectionViewDelegateFlowLayout{
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
guard let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout else { return .zero }
//소수점때문에 뷰가 망가지는 경우 방지
let width = Int((collectionView.bounds.width - (flowLayout.minimumInteritemSpacing + flowLayout.sectionInset.left + flowLayout.sectionInset.right)) / 2)
return CGSize(width: width, height: width)
}
}