[iOS] Auto Layout
2024. 12. 28. 15:20ㆍ🍏/UI
1. iOS에서 Auto Layout을 사용하는 이유와 장점
Auto Layout은 다양한 디바이스 크기와 화면 비율을 가진 iOS 환경에서, 반응형 레이아웃을 구현하기 위해 사용됩니다.
이유
- 디바이스 다양성 대응: iPhone, iPad, 다양한 화면 크기 및 방향(가로/세로) 지원.
- 유지보수 용이성: 레이아웃을 코드로 설정하는 것보다 직관적이고 수정이 쉬움.
- 애니메이션 지원: 뷰 크기와 위치를 변경할 때 자연스러운 애니메이션 처리 가능.
- 다국어 지원: 텍스트 길이가 달라지는 다국어 환경에서도 레이아웃 유연성 제공.
장점
- 유연성: 부모/자식 뷰 간 상대적 크기와 위치를 설정 가능.
- 가독성: Storyboard에서 시각적으로 제약 조건을 확인 가능.
- 코드 재사용성: 다양한 화면 크기에서 동일한 레이아웃 재사용.
- Dynamic Type 지원: 텍스트 크기 변경에 따라 레이아웃 자동 조정.
2. 제약 조건(Constraints)의 우선순위(Priority)
우선순위 개념
- 각 제약 조건에는 Priority가 설정되며, 값은 1~1000 사이입니다.
- 1000은 필수 제약 조건(Required), 그 이하(1~999)는 선택적 제약 조건(Optional)입니다.
우선순위 동작
- Auto Layout은 가능한 한 모든 제약 조건을 만족시키려고 시도합니다.
- 충돌하는 제약 조건이 있을 경우:
- 우선순위가 높은 제약 조건이 유지되고, 낮은 우선순위 제약 조건은 무시됩니다.
- 만약 필수 제약 조건끼리 충돌하면 Unsatisfiable Constraints 오류가 발생합니다.
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.heightAnchor.constraint(equalToConstant: 100).isActive = true
// 선택적 제약 조건
let optionalConstraint = view.widthAnchor.constraint(equalToConstant: 200)
optionalConstraint.priority = UILayoutPriority(750)
optionalConstraint.isActive = true
위 코드에서 높이는 100으로, 너비는 가능한 200을 유지하려고 합니다. 그러나 공간 부족 시 너비는 조정될 수 있습니다.
3. Intrinsic Content Size
개념
- Intrinsic Content Size는 뷰의 콘텐츠가 본질적으로 차지하는 크기를 의미합니다.
- 콘텐츠 크기에 따라 뷰의 기본 크기를 결정합니다.
적용 대상
- 텍스트(Label), 버튼(Button), 이미지뷰(ImageView) 등은 기본적으로 Intrinsic Content Size를 가집니다.
- 크기가 본질적으로 고정된 콘텐츠 기반 뷰.
활용
- Intrinsic Content Size를 활용하면 특정 뷰의 크기를 명시적으로 설정하지 않아도 적절한 크기를 자동으로 설정할 수 있습니다.
- 예를 들어, UILabel의 텍스트 길이에 따라 뷰의 크기가 자동 조정됩니다.
커스터마이징
- 뷰의 intrinsicContentSize 메서드를 오버라이드하여 원하는 크기를 반환할 수 있습니다.
override var intrinsicContentSize: CGSize {
return CGSize(width: 200, height: 50)
}
4. Ambiguous Layout과 Unsatisfiable Constraints
4.1 Ambiguous Layout (애매한 레이아웃)
- Auto Layout이 레이아웃을 계산할 때, 뷰의 크기나 위치를 결정할 수 없는 경우 발생합니다.
- 이유:
- 제약 조건이 불충분하여 위치나 크기를 확정할 수 없음.
- 상대적인 제약 조건만 설정되고 절대적인 기준이 없음.
해결 방법:
- 모든 뷰에 필요한 제약 조건을 추가합니다.
- 디버깅 도구(Debug View Hierarchy)를 사용하여 문제를 확인합니다.
- 런타임에 다음 코드를 호출하여 확인합니다:
print(view.hasAmbiguousLayout)
view.exerciseAmbiguityInLayout()
4.2 Unsatisfiable Constraints (불충족 가능한 제약 조건)
- 서로 충돌하는 제약 조건이 동시에 설정된 경우 발생합니다.
- 필수 제약 조건(priority = 1000)끼리 충돌하면 오류가 발생합니다.
해결 방법:
- 충돌하는 제약 조건을 식별합니다(런타임 로그 확인).
- UIView-Encapsulated-Layout-Height와 관련된 문제가 흔히 발생.
- 우선순위를 조정하여 충돌을 완화합니다.
- Debug View Hierarchy를 사용하여 제약 조건을 시각적으로 확인합니다.
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.widthAnchor.constraint(equalToConstant: 100).isActive = true
view.widthAnchor.constraint(equalToConstant: 200).isActive = true // 충돌 발생
위 코드에서는 서로 다른 두 고정 너비 제약 조건이 충돌하여 오류를 발생시킵니다. 이를 해결하려면 하나의 제약 조건을 제거하거나 우선순위를 조정합니다.
'🍏 > UI' 카테고리의 다른 글
[Swift] ActivityKit / WidgetKit / Live Activity / Dynamic Island (0) | 2024.03.18 |
---|---|
[SwiftUI] Swift Charts / 차트 (0) | 2024.02.29 |