Autolayout ์ ์ ์ฉํ๋ฉฐ UI๋ฅผ ๊ฐ๋ฐํ๋ ๋ฒ - ์ธํฐํ์ด์ค ๋น๋ vs ์ฝ๋๋ก ์์ฑ
1์ฅ์์ ์์ ์ฌ์ ์ฑ์ ๋ง๋ค๋ฉด์ ์๋์ ๋ด์ฉ๋ค์ ํ์ตํ์ต๋๋ค.
- ์์ (Asset) - ์ฑ ์์ด์ฝ, ์ด๋ฏธ์ง ํ์ผ, ๋ฐ์ดํฐ ํ์ผ์ ๊ด๋ฆฌ, ์ฑ ์คํ์ ํ์ผ์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ๋์์ค๋ค.
- ์ฑ ์๋(App thinning)๊ณผ ์ฑ ์ฌ๋ผ์ด์ฑ(App slicing) - ๋ค์ํ ๋๋ฐ์ด์ค์์ ๋น ๋ฅด๊ฒ ๋ค์ด๋ก๋ํ ์ ์๋๋ก ํ๋ ์ต์ ํ ๊ธฐ์
- Cocoa Touch, UIKit, Foundation - iOS ์ฑ ๊ฐ๋ฐ์ ํ์ํ ํ๋ ์์ํฌ
- Autolayout ์ ์ ์ฉํ๋ฉฐ UI๋ฅผ ๊ฐ๋ฐํ๋ ๋ฒ - ์ธํฐํ์ด์ค ๋น๋ vs ์ฝ๋๋ก ์์ฑ
- iOS์ View ์ฒด๊ณ - ๋ทฐ ๊ณ์ธต, ๋ทฐ์ ์ขํ, ํ๋ ์ vs ๋ฐ์ด๋, ๋ทฐ ๊ณ์ธต ๋๋ฒ๊น ํด
- ๋์์ธ ํจํด๊ณผ MVC ํจํด - ์ฑ๊ธํด ํจํด๊ณผ ์ฑ๊ฐ๋ฐ์์์ MVC ํจํด์ ์ค์ ์ ์ผ๋ก
- AVAudioPlayer, Timer - ์์ ํ์ผ์ ์ฌ์ํ๊ธฐ ์ํ AVAudioPlayer, ์๊ฐ์ด๋ฅผ ์ฌ๊ธฐ ์ํ Timer
๐ก์คํ ๋ ์ด์์ (Autolayout)
Autolayout ์ ๋ค์ํ ํฌ๊ธฐ์ ๋น์จ์ ๋๋ฐ์ด์ค์์ ์๊ฐ์ ์ผ๋ก ๋์ผํ ํ๋ฉด์ ๊ตฌํํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด๋ค. Autolayout ์ ๋ทฐ์ ์ ์ฝ์ฌํญ(constraint)์ ๋ฐํ์ผ๋ก ๋ทฐ์ ํฌ๊ธฐ์ ์์น๋ฅผ ๋์ ์ผ๋ก ๊ณ์ฐํ๋ค. ๋๋ฐ์ด์ค๋ง๋ค ํฌ๊ธฐ์ ๋น์จ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ๋ ์์ง๋ง, ์ฑ์ ์ฌ์ฉํ๋ค๊ฐ ๋ฐ์ํ๋ ์ธ๋ถ ๋ณ๊ฒฝ๊ณผ ๋ด๋ถ ๋ณ๊ฒฝ์ ์ํด ํฌ๊ธฐ์ ๋น์จ์ด ๋ฌ๋ผ์ง ์๋ ์๋ค. Autolayout ์ ํด๋น ๊ฒฝ์ฐ์๋ ๋์ ์ผ๋ก ๋ฐ์ํ๋ UI ๋ฅผ ๊ฐ๋ฅํ๋๋ก ํ๋ค!
์ธ๋ถ ๋ณ๊ฒฝ (External Changes)
์ํผ ๋ทฐ์ ํฌ๊ธฐ๋ ๋ชจ์์ด ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ธ๋ถ ๋ณ๊ฒฝ์ด๋ผ๊ณ ํ๋ค. ๋๋ฐ์ด์ค๋ฅผ ํ์ ํ๊ฑฐ๋, ์์ดํจ๋์์ ๋ถํ ๋ทฐ(Split View), ๋ค๋ฅธ ํฌ๊ธฐ์ ํด๋์ค๋ ์คํฌ๋ฆฐ์ ์ง์ํ๋ ๊ฒฝ์ฐ์ด๋ค. ์ํผ ๋ทฐ๋ ์ฑ์ ์ต์๋จ ๋ทฐ๋ก, ๋๋ฐ์ด์ค์ ํ๋ฉด์ ํด๋น ์ฑ์ด ์ฐจ์งํ ์ ์๋ ํ๋ฉด์ ๋ปํ๋ค.
๋ด๋ถ ๋ณ๊ฒฝ (Internal Changes)
์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๋ทฐ์ ํฌ๊ธฐ ๋๋ ์ค์ ์ด ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ด๋ถ ๋ณ๊ฒฝ์ด๋ผ๊ณ ํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝํ ์ธ ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋, ๊ตญ์ ๋ฅผ ์ง์ํ๊ฑฐ๋ ๋์ ํ์ ์ ์ง์ํ๋ ๊ฒฝ์ฐ์ด๋ค. ์ฝํ ์ธ ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ ์์ ๊ณผ ๋ค๋ฅธ ๋ ์ด์์์ ํ์๋ก ํ ์๋ ์๋ค.
โ๏ธ Autolayout ์์ฑ
Autolayout ์์ฑ์ ์ ๋ ฌ ์ฌ๊ฐํ(์ง์ฌ๊ฐํ, ์ ์ฌ๊ฐํ)์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
- Width, Height : ๋๋น, ๋์ด
- Top, Bottom, Leading, Trailing : ์๋จ, ํ๋จ, ํ ์คํธ ์์ ๋ฐฉํฅ(์ข์ธก), ํ ์คํธ ๋ ๋ฐฉํฅ(์ฐ์ธก)
- Center X, Center Y : ์ํ ์ค์ฌ, ์์ง ์ค์ฌ
- Baseline : ํ ์คํธ์ ํ๋จ
๐ ์์ ์์ญ (Safe Area)
Safe Area ๋ ์ฝํ ์ธ ๊ฐ ์ํ๋ฐ, ๋ด๋น๊ฒ์ด์ ๋ฐ, ํด๋ฐ, ํญ๋ฐ๋ฅผ ๊ฐ๋ฆฌ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ์์ญ์ด๋ค. Safe Area ๋ ์ด์์ ๊ฐ์ด๋๋ UIView ํด๋์ค์ safeAreaLayoutGuide ์์ฑ์ผ๋ก ์ ๊ทผํ ์ ์์ผ๋ฉฐ, iOS 11๋ถํฐ ์ฌ์ฉํ ์ ์๋ค.
* ์์ดํฐX ๋ฑ ๋ ธ์น๊ฐ ์กด์ฌํ๋ ๋์คํ๋ ์ด์ ๋ ธ์น๊ฐ ์๋ ๋์คํ๋ ์ด์ ๊ฒฝ์ฐ ์ฝํ ์ธ ๋ฅผ ํ์ํ ์ ์๋ ํ๋ฉด์ด ๋ค๋ฅด๋ค. ์ด๋ฐ ์ ๋ค์ ๊ณ ๋ คํด ์ฝํ ์ธ ๋ฅผ ์์ ์ ์ผ๋ก ๋ณด์ฌ์ค ์ ์๋๋ก Safe Area ๊ฐ ํ์ํ ๊ฒ์ด๋ค!
* ์๋ ์ด๋ฏธ์ง์๋ ์ข์ฐ ๋ง์ง์ด ๋ํ๋์์ง ์์ง๋ง, ์ค์ ํ ์คํธํด๋ณด๋ฉด SuperView ์ SafeArea ๋ ์ข์ฐ ์์ ์ง์ ์ด ๋ค๋ฅด๋ค.
โ๏ธ ์ ์ฝ (Constraint)
๋ทฐ ์ค์ค๋ก or ๋ทฐ์ ๋ทฐ ์ฌ์ด์ ๊ด๊ณ๋ฅผ Autolayout ์์ฑ์ ํตํด ์ ์ํ๋ ๊ฒ์ ์ ์ฝ(Constraint) ๋ผ๊ณ ํ๋ค. Constraint ๋ ๋ฐฉ์ ์์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ์๋ ์ ์ฝ์ "Red ๋ทฐ์ Leading (์ข์ธก) ์ง์ ์ Blue ๋ทฐ์ Trailing (์ฐ์ธก) ์ง์ ์ 1.0 ๋ฐฐ์ 8.0 ๋งํผ ๋ํ ์์น' ๋ฅผ ๋ํ๋ธ๋ค.
๐ค ์ฝํ ์ธ ๊ณ ์ ์ฌ์ด์ฆ์ ์ ์ฝ ์ฐ์ ๋
๊ณ ์ ์ฝํ ์ธ ํฌ๊ธฐ(Intrinsic Content Size)
Intrinsic Content Size ๋ ๋ทฐ์ ๊ณ ์ ์ฝํ ์ธ ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ค. ์คํ ๋ ์ด์์์ ์ ์ฉํ๊ธฐ ์ ๋ทฐ๊ฐ ๊ฐ๋ ์๋์ ํฌ๊ธฐ์ด๋ค.
- Label ์ ๊ณ ์ ์ฝํ ์ธ ํฌ๊ธฐ = Label ์ ํ ์คํธ์ ํฌ๊ธฐ
- Image ์ ๊ณ ์ ์ฝํ ์ธ ํฌ๊ธฐ = Image ์์ฒด์ ํฌ๊ธฐ
์ ์ฝ ์ฐ์ ๋(Constraint Priorities)
ํ๋์ ๋ทฐ์ ์ ์ฉ๋ ์ ์ฝ์ด ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ, ์ฐ์ ๋๊ฐ ๋์ ์ ์ฝ์ด ์ฐ์ ์ ์ผ๋ก ๋ ์ด์์์ ์ ์ฉ๋๊ณ , ์ฐ์ ๋๊ฐ ๋ฎ์ ์ ์ฝ์ ๋ฌด์๋๋ค.
์ฝํ ์ธ ํ๊น ์ฐ์ ๋ (Content hugging priority)
๊ณ ์ ์ฝํ ์ธ ํฌ๊ธฐ๋ณด๋ค ๋ทฐ๊ฐ ์ปค์ง์ง ์๋๋ก ์ ํํ๋ค. ๋ค๋ฅธ ์ ์ฝ์ฌํญ๋ณด๋ค ์ฐ์ ๋๊ฐ ๋์ผ๋ฉด ๋ทฐ๊ฐ ๊ณ ์ ํฌ๊ธฐ๋ณด๋ค ์ปค์ง์ง ์๋๋ค.
์ฝํ ์ธ ์ถ์ ๋ฐฉ์ง ์ฐ์ ๋ (Content compression resistance priority)
๊ณ ์ ์ฝํ ์ธ ํฌ๊ธฐ๋ณด๋ค ๋ทฐ๊ฐ ์์์ง์ง ์๋๋ก ์ ํํ๋ค. ๋ค๋ฅธ ์ ์ฝ์ฌํญ๋ณด๋ค ์ฐ์ ๋๊ฐ ๋์ผ๋ฉด ๋ทฐ๊ฐ ๊ณ ์ ํฌ๊ธฐ๋ณด๋ค ์์์ง์ง ์๋๋ค.
๐ก Autolayout ๊ตฌํํ๊ธฐ - ์ธํฐํ์ด์ค ๋น๋(Storyboard)
Autolayout ์ ์ธํฐํ์ด์ค ๋น๋(Storyboard) ์์ ๊ตฌํํ ์๋ ์๊ณ , ์ฝ๋๋ฅผ ํตํด ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ก ๊ตฌํํ ์๋ ์๋ค.
์คํ ๋ฆฌ๋ณด๋๋ก ๊ตฌํํ ์ ์์
- ์คํ ๋ฆฌ๋ณด๋์ View Controller Scene ์ ๊ฐ์ฒด๋ค์ ๋ฐฐ์นํ๋ค. (๋๋๊ทธ ์ค ๋๋กญ!)
- View ๊ฐ์ฒด๋ค์ Constraints ๋ฅผ ์ง์ ํด Autolayout ์ ์ ์ฉํ๋ค.
- View ๊ฐ์ฒด๋ค์ ๋์ ์ธ ๋ณํ๊ฐ ํ์ํ ๊ฒฝ์ฐ, View Controller ์ @IBOutlet ๋ณ์๋ฅผ ์์ฑํด ์ฐ๊ฒฐํ๋ค.
- View ๊ฐ์ฒด๋ค ์ค ์ฌ์ฉ์ ์ด๋ฒคํธ ๋ฑ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ, View Controller ์ @IBAction ๋ฉ์๋๋ฅผ ์์ฑํด ์ฐ๊ฒฐํ๋ค.
์คํ ๋ฆฌ๋ณด๋ ์ฌ์ฉ์ ์ฅ์
Scene ๋ง๋ค View object ๋ค์ ์๊ฐ์ ์ผ๋ก ๋ฐฐ์นํ๊ณ , Autolayout ์ ์ ์ฉํ ์ ์๊ธฐ์ ํ์ธํ๊ธฐ ์ฝ๊ณ , ์์ ์๋๋ฅผ ๋์ผ ์ ์๋ค.
ํ๋ฉด ๊ฐ ์ ํ์ธ Segue ๋ฅผ ์ฝ๊ฒ ์ฐ๊ฒฐํ ์ ์๊ณ , ์คํ ๋ฆฌ ๋ณด๋์์ ๋ฐ๋ก ํ์ธํ ์ ์์ด UI ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ํ์ํ ์ฝ๋๋ฅผ ์ค์ธ๋ค.
์คํ ๋ฆฌ๋ณด๋ ์ฌ์ฉ์ ๋จ์
๊ฐ์ ์คํ ๋ฆฌ๋ณด๋ ํ์ผ์ ์์ ํ ๊ฒฝ์ฐ ํ ํ๊ฒฝ์์ ๋ณ๋ ฌ๋ก ์์ ํ๊ธฐ๊ฐ ์ด๋ ต๋ค. (๊น ์ถฉ๋์ด ๋ ์ ์๋ค -> ๊ฐ์ ๋ค๋ฅธ ํ์ผ์ ์์ ์ ํด๊ฒฐ)
์คํ ๋ฆฌ๋ณด๋ ํ์ผ์ด ์ปค์ง ๊ฒฝ์ฐ ํ์ผ์ ์ด ๋ ๋๋ ค์ง๋ค. (ํน์ ๊ธฐ๋ฅ์ View ๋ง๋ค ์คํ ๋ฆฌ๋ณด๋๋ฅผ ๋ถํ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค)
๋์ ์ผ๋ก UI๋ฅผ ๊ตฌ์ฑํ๊ธฐ ํ๋ค๋ค. (Code ๋ก ๋ถ๊ธฐ๋ฅผ ๋๋์ด ํด๊ฒฐํด์ผ ํ๋ค)
์คํ ๋ฆฌ๋ณด๋ ์์ํ๋ฉด!
ํฐ์์ผ๋ก ๊ฐ์กฐํ ๋ถ๋ถ๋ค์ด ๋ทฐ๋ค์ Constraints ๋ฅผ ํ์ธํ ์ ์๋ ๊ณณ์ ๋๋ค. ๊ฐ ์ ์ฝ์ ๋ง๋ค๊ธฐ ์ํด์๋ Ctrl + ํด๋ฆญ (์ฒซ๋ฒ์งธ์์) -> ๋๋๊ทธ (๋๋ฒ์งธ์์) ๋ก ํ ์๋ ์๊ณ , Add New Constraint ๋ฒํผ์ ๋๋ฌ์ ์์ฑํ ์๋ ์์ต๋๋ค.
๐ก Autolayout ๊ตฌํํ๊ธฐ - Code
์ฝ๋๋ก Autolayout ์ ๊ตฌํํ๊ธฐ ์ํด์๋ ๋ทฐ์ ์ต์ปค(NSLayoutAnchor)์ ์ ์ฝ(NSLayoutConstraint)์ ๊ฑธ์ด์ฃผ๋ฉด ๋๋ค. ์ต์ปค(Anchor)๋ ์์์ ์ค๋ช ํ๋ Autolayout ์์ฑ์ด๋ผ๊ณ ์๊ฐํด๋ ๋ ๋ฏ ํ๋ค.
Anchor ์ ๊ด๋ จ๋ properties
- widthAnchor, heightAnchor : ๋ทฐ ํ๋ ์์ ๋๋น์ ๋์ด๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ ์ด์์ ์ต์ปค
- topAnchor, bottomAnchor, leadingAnchor, trailingAnchor : ๋ทฐ ํ๋ ์์ ์๋จ, ํ๋จ, ๋ฆฌ๋ฉ, ํธ๋ ์ผ๋ง์ ๊ฐ๋ฆฌํค๋ ๋ ์ด์์ ์ต์ปค
- centerXAnchor, centerYAnchor : ๋ทฐ ํ๋ ์์ ์ํ ์ค์ฌ๋ถ, ์์ง ์ค์ฌ๋ถ ๋ ์ด์์ ์ต์ปค
- constraints : ๋ทฐ์ ๋ถ์ฌํ ์ ์ฝ์ฌํญ๋ค์ ๋ด์ ๋ฐฐ์ด
์ฝ๋๋ก Autolayout ๊ตฌํํ๋ ์์
- View ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. (UIButton, UILabel ๋ฑ์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑ)
- View ๊ฐ์ฒด์ ๋ํด translatesAutoresizingMaskIntoConstraint ์์ฑ์ false ๋ก ์ค์ ํ๋ค.
- View ๊ฐ์ฒด์ ์ต์ปค์ ์ ์ฝ(constraint)์ ๊ฑธ์ด์ค๋ค.
- ์์ฑ๋ ์ ์ฝ์ ์ ์ฉํ๊ธฐ ์ํด ์ ์ฝ์ isActive ํ๋กํผํฐ์ ๊ฐ์ true ๋ก ์ค์ ํ๋ค.
NSLayoutConstraint.activate([constraint1, constraint2]) ํํ๋ก ํ๋ฒ์ ํ์ฑํ๋ ๊ฐ๋ฅํ๋ค. - ํ์ํ ๊ฒฝ์ฐ @IBOutlet ๋ณ์์ ์ฐ๊ฒฐํ๊ฑฐ๋, @IBAction ๋ฉ์๋๋ฅผ ๋ฑ๋กํ๋ค.
๐ translatesAutoresizingMaskIntoConstraint ??
--- ์คํ ๋ ์ด์์์ด ๋์ ๋๊ธฐ ์ ๋ทฐ๋ฅผ ์ ์ฐํ๊ธฐ ํํํ๊ธฐ ์ํ ์คํ ๋ฆฌ์ฌ์ด์ง ๋ง์คํฌ๋ฅผ ์ฌ์ฉํ๋ค. ์คํ ๋ ์ด์์ ์ ์ฉ์ ๊ธฐ์กด์ ์คํ ๋ฆฌ์ฌ์ด์ง๊ณผ ์ถฉ๋์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์, ์คํ ๋ฆฌ์ฌ์ด์ง์ false ๋ก ์ ์ฉ์ ํด์ ํด์ค ํ ์คํ ๋ ์ด์์์ ์ ์ฉํ๋ ๊ฒ์ด๋ค.
--- Storyboard ์์ Autolayout ์ ์ ์ฉํ๋ ๊ฒฝ์ฐ, ์๋์ผ๋ก false ๊ฐ์ ํ ๋นํ๋ค.
์ฝ๋๋ก ์ ์ฝ ์กฐ๊ฑด ์ง์ ํ๋ ๋ฐฉ๋ฒ
1. NSLayoutConstraint ์ธ์คํด์ค ์์ฑ์ผ๋ก ์ ์ฝ ์กฐ๊ฑด ์ง์ ํ๋ ๋ฐฉ๋ฒ
// button ์ view ์ ์์ง ์ค์ ์์น * 0.8 ์ ๋ฐฐ์น
let centerY: NSLayoutConstraint
centerY = NSLayoutConstraint(item: button,
attribute: .centerY,
relatedBy: .equal,
toItem: self.view,
attribute: .centerY,
multiplier: 0.8,
constant: 0)
2. Layout Anchor ์ constraint ํจ์๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ
ํด๋น ํจ์๋ ์์ฑ๋ NSLayoutConstraint ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
let centerX: NSLayoutConstraint // button ์ view ์ ์ํ ์ค์์ ๋ฐฐ์น
centerX = button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor)
๋ฆฌ๋ทฐ
๊ธฐ์กด์๋ Storyboard ์์ฃผ๋ก UI ๊ฐ๋ฐ์ ํ์๊ธฐ์ Autolayout ์ ์ฝ๋๋ก ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ์ ํํ ์์ง ๋ชปํ๋ค. ๋ถ์คํธ์ฝ์ค ๊ฐ์๋ฅผ ํตํด ํ์คํ๊ฒ ํ์ตํ๊ณ ๋์ด๊ฐ ์ ์์๋ค! ์คํ ๋ฆฌ๋ณด๋ / ์ฝ๋ / XIB ์ด์ฉ์ ์ฌ๋ฐ์ฌ, ํ๋ฐํ, ํ๋ฐํ ์ด๋ผ๊ณ ๋ค์๊ธฐ์.. ๋์ ๋ง๊ฒ ์ ์ ํ๊ฒ ์ ๋ถ ์ธ ์ ์์ผ๋ฉด ์ข์ง ์์๊น?
์ฐธ๊ณ ๋งํฌ