일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 안드로이드
- ios
- 제트팩 컴포즈
- static 맴버 로딩
- 절차 지향 언어
- 객체 지향 언어 vs 절차 지향 언어 차이점
- 자바 소켓통신
- 라즈베리파이 회로
- 라즈베리파이 메모리
- ondevice ai
- 2025 정보처리기사
- java 클래스 로딩
- 네트워크프로그래밍
- autolayout
- 프로그래밍뷰
- 라즈베리파이
- 라즈베리파이 led
- Xcode
- 디자인 패턴
- 2025 정보처리기사 필기
- rubikpi
- qualcomm ai hub
- 라즈베리파이 개발환경
- 라즈베리파이 os
- SWIFT
- java 실행과정
- 개방폐쇄 원칙
- numpy
- jetpack compose
- 포트넘버
- Today
- Total
From_Base
[iOS Programming] 4. 오토레이아웃(autoLayout) 본문
오토레이아웃은 여러 아이폰 및 아이패드 등 다양한 기기-다양한 화면 크기에서도 UI를 안정적으로 일관되게 구성할 수 있도록 해주는 핵심 기능이다. 특히 다양한 디바이스가 존재하고 사용자의 인터페이스 사용 방식이 복잡해진 현재의 모바일 환경에서는 오토레이아웃의 역할이 매우 중요하다.
⬛️ 오토레이아웃의 필요성
하나의 iOS 앱은 iPhone SE처럼 작은 화면부터 iPad Pro와 같은 대형 화면까지 다양한 디바이스에서 실행된다. 또한, 모바일 환경은 가로/세로 회전과 분할 화면 등 다양한 환경 변화가 빈번히 일어나기에 이에 잘 대응해야한다. 각각의 화면에서 UI가 적절하게 보여지기 위해서는 레이아웃이 유연하게 대응할 수 있어야 하며, 이를 위해 등장한 것이 오토레이아웃이다.
오토레이아웃 이전에는 오토리사이징이 존재했지만, iOS 6 이후 오토레이아웃을 사용하면서 오토리사이징은 잘 사용하지 않는다.
오토레이아웃과 오토리사이징을 동시에 적용할 수도 있다.
🔹 오토리사이징(autoResizing)
- 예전 방식으로, 슈퍼뷰 크기에 따라 하위 뷰의 크기나 위치를 자동 조정하는 방식
- 고정 여백 설정과 비례 크기 조절이 가능하지만, 복잡한 UI에는 적합하지 않음
- iOS 6 이후 오토레이아웃이 도입되면서 점차 사용 빈도가 줄어들고 있음
🔹 오토레이아웃(autoLayout)
- 뷰 간의 상대적인 제약조건(Constraints)을 통해 동적으로 레이아웃을 구성하는 방식
- 다양한 화면 크기, 방향, 디바이스에 대응 가능한 반응형 UI를 만들 수 있음
- Auto Layout은 인터페이스 빌더와 코드 양쪽에서 모두 적용 가능하며, 더욱 정밀한 UI 제어가 가능
⬛️ 오토레이아웃의 핵심 개념
하나의 View에 대하여 어떠한 화면의 크기에 대해서도 좌측상단좌표(left, height)와 크기(width, height)를 계산할 수 있으면 Satisfiable layout이라고 하는데, 화면상의 모든 View가 Satisfiable layout이면 이 화면은 오토레이아웃을 만족하게된다.
즉, View의 크기(너비, 높이)와 이웃 View와 간격으로 Satisfiable Layout를 이루는 것을 오토레이아웃.
이때의 이웃은 가장 가까운 이웃(Default)을 말하는데 가까운 이웃이 없는 경우는 부모 뷰를 이웃으로 본다.
🔹 주요 용어 및 속성
- leading / trailing / left / right: 오토레이아웃의 정의에 필요한 속성이자 UI의 방향성과 관련된 개념이다. 중동국가에서는 leading = right, trailing = left 이고 그 외 국가에서는 leading = left, trailing = right 이다. 즉, 그 외 국가에 속하는 우리나라의 경우엔 leading속성은 뷰의 왼쪽을 뜻하고 trailing은 뷰의 오른쪽을 뜻한다.
- Safe Area: iOS 11 이후 도입된 개념으로, 상태바, 네비게이션 바, 홈 인디케이터 등 시스템 UI 요소를 침범하지 않도록 제한된 뷰 영역을 말한다. Apple이 safe area 밖에 View를 배치하지 말 것 을 권고하면서 나온 영역으로, 앱의 가장 중요한 디폴트 영역인 상단 탑바나 하단바 등등 주요 영역에 사용자 지정 뷰들이 침범하지않도록 만들어둔 공간이다. 사용자 지정 뷰들은 이 Safe Area안에서만 존재하게된다.
🔹 제약조건과 여백 계산 (Constraints & Spacing)
오토레이아웃에서 레이아웃을 결정짓는 가장 중요한 구성요소는 제약조건(Constraints)이다. 이 제약조건을 통해 뷰 간의 상대적 관계를 정의하게 되며, 여백(margin)이나 크기(size), 위치(position) 등을 세밀하게 제어할 수 있다.
오토레이아웃에서 Constraint(제약조건)은 단순히 뷰의 위치나 크기를 정하는 것 이상으로, 뷰 간의 관계를 수식 형태로 정확하게 표현하는 도구이다. 이 제약조건을 통해 여백(margin), 상대적 위치, 크기 비율까지 모두 조정할 수 있다.
오토레이아웃에서의 제약 조건은 다음과 같은 수학적 표현으로 구성된다.
item1.attribute1 = multiplier × item2.attribute2 + constant
📌 제약조건 예시: 두 뷰 사이 여백 설정
RedView.leading = 1.0 × BlueView.trailing + 8.0
이 수식은 RedView의 leading(왼쪽) 위치가 BlueView의 trailing(오른쪽) 위치보다 8pt 만큼 오른쪽에 있다는 의미이다.
즉, 두 뷰 사이의 수평 여백이 8pt가 되도록 제약이 설정된 것이다.
RedView | 제약을 적용할 뷰 (Item 1) |
.leading | 적용할 속성 (Attribute 1) |
1.0 | 배수 계수 (Multiplier) |
BlueView | 기준이 되는 뷰 (Item 2) |
.trailing | 기준 뷰의 속성 (Attribute 2) |
+8.0 | 고정 여백 값 (Constant) |
이런 방식으로 뷰 사이 간격, 위치 정렬, 비율 설정 등을 세밀하게 지정할 수 있다.
⬛️ 오토레이아웃 도구 소개 (Xcode Interface Builder 기준)
1) Align Tool
- 여러 뷰를 수평 또는 수직 방향으로 정렬할 때 사용
- 정렬 축과 기준 뷰를 설정하여 간단하게 레이아웃을 맞출 수 있음
- 원하는 뷰들을 선택하고 Align Tool을 클릭
- 아래와 같은 팝업에서 적절한 제약조건을 선택 후 더함
2) Pin Tool (Add New Constraints)
- 뷰의 여백, 고정된 너비/높이, 비율 제약 등을 설정할 수 있는 도구
- Pin tool은 뷰의 상대적 위치와 크기에 대한 제약 조건을 적용
- 설정 후 빨간 점선으로 표시된 제약은 아직 완전히 적용되지 않은 상태이며, Update Frames나 Resolve Auto Layout Issues를 통해 반영해야 한다.
3) Resolve Auto Layout Issues
- 제약조건 충돌, 누락, 불완전 적용 등의 문제를 해결하는 데 사용
- 일반적인 자동 레이아웃 문제를 해결하기위한 여러 가지 옵션을 제공
- 상단은 현재 선택된 뷰, 아래쪽 옵션은 모든 뷰에 영향
- 주요 기능:
- Clear Constraints: 해당 제약조건을 모두 지움, 모든 제약조건을 제거
- Add Missing Constraints: 필수 제약조건을 자동으로 추가, 추가적으로 제약 조건들을 자동으로 생성
- Reset to Suggested Constraints: 현재 적용된 제약 조건들을 지우고 필요한 제약 조건들을 자동으로 생성하는 옵션, Xcode가 제안하는 기본 제약조건으로 재설정
- Update Constraint Constants: 현재의 Constraint에서 UIView의 이동후 이 동값에 대한 상수를 적용하고자 하는 경우,뷰의 현재 위치와 크기에 맞춰 상수 값 업데이트
⬛️ 상대적 콘텐츠 크기 제어
🔹 콘텐츠(뷰 객체) 크기
: 뷰 객체의 너비와 높이
- 원칙적으로는 Constraint를 적용하여 크기를 설정하여야 함
- 일부 뷰 객체는 디폴트로 크기가 정해지는 것도 있음
🔹 고유 콘텐츠 크기 (Intrinsic Content Size)
: 뷰 객체가 표시할 내용을 기반으로 뷰의 크기가 어느 정도될 지에 대한 정보
- 라벨의 고유 콘텐츠 크기는 표시할 텍스트 크기에 기반을 둔다
- 이미지 뷰의 고유 콘텐츠 크기는 직접 선택한 이미지 크기이다
- UILabel, UIButton, UIImageView 등은 콘텐츠 자체의 크기를 기준으로 기본 크기를 결정한다
- 예: UILabel은 텍스트 길이에 따라, UIImageView는 이미지의 원본 해상도에 따라 intrinsic size가 달라진다
🔹 상대적 콘텐츠 크기
- 여러 개의 뷰 객체가 동시에 크기가 변경되어야 하는 경우 콘텐츠의 크기
- 각 뷰 객체는 크기 변경에 대한 우선 순위가 있어 이에 따라 크기가 변경됨
⬛️ 콘텐츠 크기의 우선 순위
🔹 허깅 우선순위 (Hugging Priority)
- 뷰가 "지금보다 더 커지지 않으려는 정도"를 의미
- 늘어나기 싫어하는 우선순위 (낮으면 잘 늘어난다, 고무밴드와 같다)
- 크기에 대한 설정이 없는 뷰 객체는 가장 낮은 우선 순위를 갖는다
- 우선순위 값이 높을수록 늘어나기 싫어하므로 뷰는 현재 크기를 유지하려고 하며, 다른 뷰가 확장되도록 유도
🔹 압축 저항 우선순위 (Compression Resistance Priority)
- 뷰가 "지금보다 작아지지 않으려는 정도"를 의미
- 줄어들기 싫어하는 우선순위 (낮으면 잘 줄어든다, 스프링과 같다)
- 크기에 대한 설정이 없는 뷰 객체는 가장 낮은 우선 순위를 갖는다
- 이 값이 높을수록 크기압축에 더욱 저항하므로 뷰는 크기가 줄어드는 것을 거부하고, 대신 다른 뷰가 줄어들게 됨
⬛️ Stack View
제약조건 없이도 간단한 레이아웃을 잡을 수 있는 방법이 있다. 바로 UIStackView를 활용하는 것이다.
📌 StackView란?
StackView는 여러 뷰들을 일렬로 정렬하고 자동으로 간격과 정렬을 조절해주는 컨테이너 뷰이다.
복잡한 제약 없이도 기본적인 레이아웃을 빠르게 잡을 수 있어서 자주 사용된다.
스택 뷰는 복잡한 제약 조건을 도입하지 않고도 자동 레이아웃의 기능을 쉽게 활용할 수있는 방법을 제공해주는 유용한 도구인 것이다.
안드로이드의 LinearLayout과 유사하다
✅ StackView의 주요 속성
axis (UIStackView only) | 오리엔테이션 지정: 정렬 방향 (horizontal 또는 vertical) |
alignment | 오리엔테이션의 수직 방향에서 자식 뷰들의 위치-정렬방식 지정 |
distribution | 자식 뷰들을 오리엔테이션 방향에 따라 분배 방법 지정, 공간 분배 방식 (fill, fillEqually 등) |
spacing | distribution에서 자식 뷰들 사이의 간격, 자식 뷰 간의 간격 |
⬛️ StackView 실습: 로그인 화면 만들기
✔︎ 1단계: 기본 구성
- UILabel(Login ID), UITextField, UILabel(Password), UITextField, UIButton(OK)를 스토리보드 뷰컨트롤러의 적절한 위치에 놓기
- Login ID, UITextField 두 컴포넌트를 나란히 배치하고 동시에 선택하여 Editor > Embed In > StackView를 적용 -> 이러면 라벨과 텍스트필드가 하나의 스택뷰 컨테이너에 포함되어짐
- StackView의 배경색을 노란색으로 설정
- 위 과정과 마찬가지로 Password, UITextField를 동시에 선택한 후 StackView를 적용 & StackView 배경색을 노란색으로 변경
- 위 1~4 과정을통해 만들어진 두 개의 StackView와 OK버턴을 동시에 선택한 후 이들에 대하여 또하나의 StackView를 적용 -> 이러면 2개의 스택뷰와 하나의 버튼 컴포넌트를 포함하고있는 하나의 스택뷰가 존재할 것이다. 이 최상위 스택뷰의 배경색을 파란색으로 설정해주어 색으로 구분해주자.
✔︎ 2단계: 바깥 최상위 StackView에 속성 적용
- Alignment: Fill
- Distribution: Fill
- Spacing: 10
- Constraint 설정: Add New Constraints(Pin Tool)에서 좌우 여백 20으로 설정, Align Tool에서 수직 & 수평 중앙 정렬(Horizontally&Vertically in Container값 0으로 설정)
이처럼 스택뷰를 통해 이전처럼 복잡한 제약 조건을 도입하지 않고도 자동 레이아웃의 기능을 쉽게 활용할 수 있어, 훨씬 간단하게 구조를 잡을 수 있다
✔︎ 3단계: 내부 2개의 StackView에 각각 속성 적용
- Alignment: Fill
- Distribution: Fill
- Spacing: 10
✔︎ 4단계: Login ID와 Password 라벨 너비를 동일한 크기로 정렬
Login ID를 Ctrl+Drag -> Password에서 Drop
✅ 결과 화면
마무리
오토레이아웃은 단순한 레이아웃 도구를 넘어서, 다양한 화면 환경에 최적화된 유연하고 반응형 UI를 구성할 수 있게 해주는 핵심 기술이다.
제약조건과 우선순위를 적절히 조합하고, 다양한 실습을 통해서 이 autoLayout을 어떻게 적용할 수 있는지 잘 익혀두는 것이 중요할 것 같다.
'IOS' 카테고리의 다른 글
[iOS Programming] 5. 프로그래밍으로 View 구성&배치(프로그래밍 뷰) (0) | 2025.04.17 |
---|---|
[iOS Programming] 4-2. 오토레이아웃 보충 (0) | 2025.04.11 |
[iOS Programming] 3. 뷰와 뷰 계층 구조(View & View Hierarchy) (0) | 2025.03.27 |
[iOS Programming] 2. Xcode Playground & Swift 문법 알아보기 (1) | 2025.03.20 |
[iOS Programming] 1. 개발환경 및 기본개념&앱 개발 실습 (0) | 2025.03.13 |