반응형
SwiftUI에서 많이 하는 실수 - GeometryReader를 오용해 레이아웃이 엉망이 되는 실수
GeometryReader는 부모 공간의 크기를 참조하여 레이아웃을 계산할 수 있는 강력한 도구입니다.
하지만 무분별하게 사용하면 View가 화면 전체를 차지하거나, 의도치 않은 위치에 배치되면서
레이아웃이 쉽게 망가집니다.
1. 문제 원인
- Auto Layout / frame 기반 사고를 그대로 SwiftUI에 가져옴
- “일단 GeometryReader로 감싸고 frame 계산하면 되겠지”라는 식의 사용
- GeometryReader가 기본적으로 가능한 한 최대 공간을 차지한다는 점을 모름
2. 나타나는 증상
- 특정 컴포넌트만 커지길 원했는데 화면 전체를 덮어버림
- 스크롤뷰 안에서 레이아웃이 이상하게 늘어나거나 스크롤이 안 됨
- 디바이스 회전/사이즈 변경 시 예측 불가능한 위치로 이동
3. 잘못된 코드 예시
struct BadLayoutView: View {
var body: some View {
GeometryReader { geo in
// ❌ 전체 화면을 차지
Text("Hello")
.position(x: geo.size.width / 2,
y: geo.size.height / 2)
}
.background(Color.yellow)
}
}
- 이 View는 부모가 허용하는 모든 공간을 차지합니다.
- 다른 View와 함께 배치했을 때 레이아웃이 깨지게 됩니다.
4. 올바른 코드 예시
4-1. 꼭 필요한 영역에만 한정
struct CenteredTextView: View {
var body: some View {
VStack {
Text("위 영역")
GeometryReader { geo in
Text("가운데 텍스트")
.frame(width: geo.size.width, height: geo.size.height)
.background(Color.blue.opacity(0.2))
}
.frame(height: 200) // ✅ GeometryReader 높이를 한정
Text("아래 영역")
}
}
}
4-2. alignmentGuide / frame 조합으로 대체 가능 여부 먼저 확인
struct WithoutGeometryReader: View {
var body: some View {
ZStack(alignment: .center) {
Color.yellow
Text("중앙 정렬 텍스트")
}
}
}
- 단순 중앙 정렬, 비율 기반 배치 등은 frame/alignment로 충분한 경우가 많습니다.
5. 정리 및 팁
- GeometryReader는 “진짜로 부모 크기 값이 필요할 때만” 사용하는 마지막 수단에 가깝습니다.
- 레이아웃이 이상하게 커지거나, 화면 전체를 차지한다면 GeometryReader 남용을 의심해보세요.
- 대체 가능하다면 frame, alignment, Spacer, Layout 프로토콜 등을 먼저 고려하는 편이 좋습니다.
반응형
'Dev Study > SwiftUI' 카테고리의 다른 글
| SwiftUI에서 많이 하는 실수 - animation()을 남발해 의도치 않은 애니메이션이 발생하는 실수 (0) | 2025.12.05 |
|---|---|
| SwiftUI에서 많이 하는 실수 - List 셀 내부에서 상태 변경/로직을 수행해 무한 렌더링이 발생하는 실수 (0) | 2025.12.05 |
| SwiftUI에서 많이 하는 실수 - ScrollView 안에서 LazyVStack을 사용하지 않아 성능이 나빠지는 실수 (0) | 2025.12.05 |
| SwiftUI에서 많이 하는 실수 - offset을 레이아웃 도구로 사용해서 반응형이 깨지는 실수 (0) | 2025.12.05 |
| SwiftUI에서 많이 하는 실수 - ViewModel에 비즈니스 로직과 UI 상태를 모두 섞어버리는 실수 (0) | 2025.12.05 |
| SwiftUI에서 많이 하는 실수 - ObservableObject에서 @Published를 남발하는 실수 (0) | 2025.12.05 |
| SwiftUI에서 많이 하는 실수 - UI 업데이트를 메인 스레드에서 하지 않아 생기는 문제 (0) | 2025.12.05 |
| SwiftUI에서 많이 하는 실수 - .task와 .onAppear를 혼동해 비동기 로직이 중복 실행되는 실수 (0) | 2025.12.05 |

