[ Swift ] UICollectionView 셀이 양옆에 붙지 않았던 이유
![[ Swift ] UICollectionView 셀이 양옆에 붙지 않았던 이유](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog-custom%3Ftitle%3D%25EB%25A7%25A4%25EC%259D%25BC%2B%25EC%259E%2591%25EC%258B%25AC%25EC%2582%25BC%25EC%259D%25BC%2B%25EC%258A%25A4%25EC%259C%2584%25ED%2594%2584%25ED%258A%25B8%2B%26tag%3DTemplate%2B1%26description%3DUICollectionView%2B%25EC%2585%2580%25EC%259D%25B4%2B%25EC%2596%2591%25EC%2598%2586%25EC%2597%2590%2B%25EB%25B6%2599%25EC%25A7%2580%2B%25EC%2595%258A%25EC%2595%2598%25EB%258D%2598%2B%25EC%259D%25B4%25EC%259C%25A0%26template%3D3%26backgroundImage%3Dhttps%253A%252F%252Fsource.inblog.dev%252Fog_image%252Fdefault.png%26bgStartColor%3D%2523ffffff%26bgEndColor%3D%2523ffffff%26textColor%3D%2523000000%26tagColor%3D%2523000000%26descriptionColor%3D%2523000000%26logoUrl%3Dhttps%253A%252F%252Fsource.inblog.dev%252Flogo%252F2025-12-14T06%253A52%253A12.131Z-2ee36a77-8c77-4dad-b644-71cc341cf882%26blogTitle%3DRN%2B%25EC%2582%25BD%25EC%25A7%2588%2B%25EC%259D%25BC%25EC%25A7%2580&w=3840&q=75)
목표했던 화면
UICollectionView는 Safe Area 기준으로 화면에 꽉 차게
셀은 컬렉션뷰 너비와 동일
이미지가 양옆 여백 없이 딱 붙는 피드 형태
📸 문제 발생 화면
셀 사이즈 계산은 맞아 보이는데
실제 화면에서는 양옆에 미묘한 여백이 존재
설정 값
1️⃣ 컬렉션뷰 제약
스토리보드에서 UICollectionView를 다음과 같이 설정했다.
Leading / Trailing / Top / Bottom
모두 Safe Area 기준
2️⃣ 셀 사이즈 계산 코드
func collectionView(
_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath
) -> CGSize {
let width = collectionView.bounds.width
let height = width * 3 / 4
return CGSize(width: width, height: height)
}
컬렉션뷰는 Safe Area에 맞게 잡혀 있고
셀 width는 컬렉션뷰 width와 동일하게 계산
이렇게 계산했는데 첫 문제 발생 화면 이미지처럼 양옆에 여백이 생겼다.
원인
처음엔 Safe Area 여백 또는 AutoLayout의 제약설정이 잘 못 된건가 라고 생각했지만 뭘 어떻게해도 동일한 결과가 나왔고 서치한 결과 FlowLayout은 너비값을 추정해서 반영한 것이 었다 즉.
문제의 핵심은 UICollectionViewFlowLayout의 자동 셀 사이즈 추정 로직으로
UICollectionViewFlowLayout은 두 가지 방식으로 아래와 같이 지원된다.
정적 셀 사이즈
sizeForItemAt으로 명확하게 계산
Self-Sizing Cell
AutoLayout 기반
estimatedItemSize를 기준으로 셀 크기를 추정 후 재계산
내 경우에는 이미 셀 사이즈를 코드로 계산하고 있었지만, 셀이 AutoLayout으로 구성되어 크기가 변할 수 있겠다고 추정된 것.
해결
viewDidLoad내에 아래 로직을 추가해서 추정을 비활성화 했고
if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
flowLayout.estimatedItemSize = .zero
}결과는 셀이 collectionView 너비를 그대로 사용할 수 있게 되었다.
estimatedItemSize = .zero 이 한줄은 셀 사이즈를 자동으로 추정하지 않겠다 라고 명시한것이다.