iOS ์ฑ๊ฐ๋ฐ์์ ํ๋ฉด์ ๋ด๋นํ๋ค๋ฉด ํผํ ์ ์๋ autolayout! ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด๋ฉฐ ์ ๋ฆฌํด๋ณด์. ๊ฐ๋ตํ๊ฒ!
Introduction
Constraints๋ฅผ ๊ธฐ๋ฐ์ผ๋ก View hierarchy์ ์๋ ๋ชจ๋ ๋ทฐ์ ํฌ๊ธฐ์ ์์น๋ฅผ ๋์ ์ผ๋ก ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ
๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์ํ์ ๋, ๋์ ์ผ๋ก ๋์์ด ๊ฐ๋ฅํ๋ค. ์ด๋ค ๋ณ๊ฒฝ์ฌํญ๋ค์ด ์์๊น?
- ์ธ๋ถ
- ์ฐฝ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ (OS X)
- ๋ถํ ๋ณด๊ธฐ (iPad)
- ํ์ (iOS)
- ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ ์ง์
- ๋ค์ํ ํฌ๊ธฐ ํด๋์ค๋ฅผ ์ง์
- ๋ด๋ถ
- ํ์๋๋ ์ปจํ
์ธ ์ ๋ณํ
- ์ปจํ ์ธ ๋ณํ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ ์ด์์์ ๊ฐ์ ธ์ผ ํ ์ ์๋ค. (ํ ์คํธ, ์ด๋ฏธ์ง)
- ๊ตญ์ ํ (๋ค์ํ ์ธ์ด)
- ์ธ์ด๋ง๋ค ๊ฐ์ ๋จ์ด์ ๊ธธ์ด๊ฐ ๋ฌ๋ผ์ง (ํ ์คํธ์ ๊ณต๊ฐ)
- ๋ฏธ๊ตญ๊ณผ ํ๊ตญ์ ๋ ์ง ๋ํ๋ด๋ ์์๊ฐ ๋ฐ๋์ (๋ ์ง ๋ฐ ์ซ์์ ๋ฐ๋ฅธ ๋ณํ)
- ์๋ ์ธ์ด๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ (๋ ์ด์์ ๊ตฌ์ฑ)
- ๊ธ๊ผด ํฌ๊ธฐ ์กฐ์ ์ ๋ฐ๋ฅธ ๋ ์ด์์ ๋ณ๊ฒฝ
- ํ์๋๋ ์ปจํ
์ธ ์ ๋ณํ
Autolayout vs. Frame-based Layout
Frame-based Layout
Frame-based Layout์ ์ด์ ์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค. UI๋ฅผ ๋ง๋ค๋ ค๋ฉด, ๋ชจ๋ View ์ ๋ํ ํฌ๊ธฐ์ ์์น๋ฅผ ๊ณ์ฐํด์ผ ํ๋ค. ๋ทฐ ๊ณ์ธต์ด ๋ด๋ ค๊ฐ์ ๋ฐ๋ผ ํ์ ๋ทฐ๋ ์์ ๋ทฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์น์ ํฌ๊ธฐ๋ฅผ ์ก๊ฒ๋๋๋ฐ, ์ด๋ ๊ฒ ์์ฐจ์ ์ผ๋ก ์ฝํ์๊ธฐ ๋๋ฌธ์, ๋ณต์กํ ๋ทฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ๊ต์ฅํ ๊ท์ฐฎ์๋ค. ๋ํ ๋ง์ฝ์ ํ๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ๋ฉด ์ด ์ง์ ๋ค์ ํด์ผํ๋ค. ์ผ์ผ.
์ด๋ฐ ์ด๋ ค์์ ์์ด์ autoresizing mask
๋ผ๋ ๊ฒ์ด ์๋ค. super view์ ํ๋ ์์ด ๋ณ๊ฒฝ๋ ๋, ๋ด ํ๋ ์์ด ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋ ์ง ์ค์ ํ ์ ์๋ค.
์คํ ๋ฆฌ๋ณด๋์์ ๋ณด๋ ์ด๋
์์ด๋ค. ํ๋ฉด์ ๋ณด๋ฉด ์ํ์ข์ฐ, ๋ด๋ถ ์ธ๋ก, ๊ฐ๋ก์ ํ์ดํ๊ฐ ์๋ค. ์ค๋ฅธ์ชฝ์๋ ํด๋น ์ต์
์ ํด๋ฆญํ์ ๋, ์์ ๋ทฐ์ ์ด๋ค ๊ด๊ณ๋ฅผ ๋งบ์ด์ ๋ณด์ผ์ง์ ๋ํ ๊ฐ๋จํ ์ ๋๋งค์ด์
์ ๋ณด์ฌ์ค๋ค. autolayout์ ์ค์ ํ ๋๋, ํด๋น ์ต์
์ ์ฌ์ฉํ์ง ์๊ฒ ๋ค๊ณ ๋ช
์์ ์ผ๋ก ์ ์ธํด์ฃผ์ด์ผ ํ๋ค. customView.translatesAutoresizingMaskIntoConstraints = false
ํ์ง๋ง ์ด๋ฐ autoresizing mask๋ ์์์ ์ดํด๋ณด์๋ ๋ณ๊ฒฝ์ฌํญ๋ค ์ค์ ๋ถ๋ถ์ ์ผ๋ก๋ง ์ปค๋ฒ๊ฐ ๊ฐ๋ฅํ๋ค. ์ฆ, ์์ ์ธ๋ถ, ๋ด๋ถ ๋ณ๊ฒฝ์ฌํญ ์ค์์ ์ธ๋ถ ๋ณ๊ฒฝ์ฌํญ๋ง ๋ฐ์ํ ์ ์๋ค.
์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์์ ์กฐ๊ธ๋ ๋์๊ฐ, ๋์ ์ผ๋ก ๋ ์ด์์์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก autolayout์ด๋ค.
Autolayout
๋ ์ด์์์ ์ค์ ํ๋ ๊ฒ์ด ์๋, ๊ด๊ณ๋ฅผ ์ค์ ํ๊ณ ๋๋จธ์ง๋ ๋งก๊ธฐ๋ ๋ฐฉ์์ด๋ค. ๊ทธ๋ฆผ์ ์ ๋ณด๋ฉด, ์ํ์ข์ฐ, view๊ฐ์ ๊ด๊ณ, ๋๋น, ๋์ด ๋ฑ์ ๋ํด ์ซ์๊ฐ ๋ฌ๋ ค์๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ฐ ๊ด๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์ผ๋ก view ์์์ ํฌ๊ธฐ์ ์์น๋ฅผ ๊ณ์ฐํ์ฌ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด autolayout์ด๋ค.
Anatomy of a Constraint
์๊ฐ๋ณด๋ค ์ฝ๋ค. ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ 2๊ฐ์ view์ฌ์ด์ ๊ด๊ณ๋ฅผ ์ ์ํด์ฃผ๋ฉด ๋๋ค. ์์์ ๋ถํฐ ์ฝ์ด๋ณด๋ฉด, RedView์ Leading์ BlueView์ trailing์ 1๋ฐฐ์ด๊ณ ์ถ๊ฐ์ ์ผ๋ก 8๋งํผ์ ์์๋ฅผ ๋ํ ๊ฐ์ด๋ค.
left, right๊ฐ ์๋๊ณ ์ leading, trailing์ธ๊ฐ์?
๊ตญ์ ์ ๋ฐ๋ผ left์ ์ฌํ์ ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, left๋ผ๋ ๋จ์ด์๋ ์ฌ๋ฌ๊ฐ์ง ์๋ฏธ๊ฐ ํผ์ฌ๋์์ ์ ์๋ค. ๋ถ์ ์ ์๋ฏธ (์ธ๋), ๊ธ์ ์์์ (ํ๊ตญ, ๋ฏธ๊ตญ, ์ผ๋ณธ), ๊ธ์ ๋์ (์๋๊ถ) ๋ฑ๋ฑ. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ข๋ ๋ช ํํ ์๋ฏธ๋ก leading, trailing์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
Autolayout Attributes
ํน์ฑ์ผ๋ก๋ ์ฌ๋ฌ๊ฐ๊ฐ ์๋ค. ์ด๋ ์ค์ ๋ก ์คํ์ ๋ณด๊ณ , ์ ์ฐํ๊ฒ ์ ์ฉํ๋ ๊ฒ์ด ํ์ํ๋ค. ์ฝ์ง ์ฌ๋ฌ๋ฒ ํด๋ณด๋ฉด ๊ฐ์ด ์จ๋ค.
๊ทธ๋ฐ๋ฐ.. ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ ์์๋ฌ์ผ, ๋์ค์ ์ฐพ์์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
Constraint Inequalities
์ง๊ธ์ ๊ตฌ์ ๋ฐฉ์ ์์ด ๋ฑํธ์ธ ๊ฒ๋ง ์์๋ณด์๋๋ฐ, ๊ทธ๋ ์ง ์์ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด์ ๋๊ฐ์ view๊ฐ ์๋๋ฐ ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ์์ฒญ ์ฐ๊ทธ๋ คํธ๋ ธ๋ค๊ณ ์๊ฐํด๋ณด์.
๊ทธ๋ฐ ์ํฉ์์ ๊ผญ ๋ณด์ฌ์ผ ํ๋ Title์ด ์์ด์, ์๋์ ์ผ๋ก ๋ ์ค์ํ View๊ฐ ์ฐ๊ทธ๋ฌํธ๋ ค์ง๊ฒ ํ๊ณ ์ถ๋ค. ์ฆ, ์ ์ฝ ์กฐ๊ฑด์ ์ํฅ๋๋ฅผ ์กฐ์ ํ๊ณ ์ถ๋ค๋ ์๊ธฐ๋ค.
์ด๋ฐ ๊ฒฝ์ฐ ์๋ํด ๋ณผ ์ ์๋ ์ต์ ์ด ๋ถ๋ฑ์์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
// A single equal relationship
Blue.leading = 1.0 * Red.trailing + 8.0
// Can be replaced with two inequality relationships
Blue.leading >= 1.0 * Red.trailing + 8.0
Blue.leading <= 1.0 * Red.trailing + 8.0
Constraint Priorities
๋ค์์ผ๋ก๋ ์ฐ์ ์์๋ฅผ ์ ํ ์ ์๋ค.
UILabel๊ฐ์ ๋ ์์ ์ฌ๋ฆฌ๊ณ ์กฐ์ฌํด๋ณด๋ฉด ์์ ๊ฐ์ ๋ ์์ด ๋์จ๋ค. ์ฐ์ ์์๋ฅผ ์ ํ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ๊ฐ ์๋ค. ํ๋์ฉ ์์๋ณด์.
Hugging priority
์ซ์๊ฐ ํฌ๋ฉด ๋ โ์๊ณ ์ถ์ด == ์์์ง๊ณ ์ถ์ด!โ
๋ผ๋ฒจ ๋๊ฐ๋ฅผ ์ฌ๋ ค๋๊ณ leading 20, ์ฌ์ด 20, trailing 20์ ์ฃผ์๋ค. ์ด๋ฐ ์ํฉ์ด๋ฉด ๋ label์ค ํ๋๋ width๊ฐ ๋์ด๋์, ์ด constraint๋ฅผ ๋ง์กฑ์์ผ์ฃผ์ด์ผ ํ๋ค. ์ฆ, ์ด๋ค๋ ํ๋๋ ๋์ด๋์ผ ํ๋ค! (๋นจ๊ฐ์์ผ๋ก ์ ์ฉ์๋จ)
๋ง์ฝ, ์ด๋ฐ ์ํฉ์์ ์ผ์ชฝ์ด ์ข๋ ์์ผ๋ก ๋ค์ด๊ฐ๋ ค๋ ๊ฒฝํฅ์ ๊ฐ์ง๊ณ ์ถ๋ค๋ฉด ์ผ์ชฝ label์ hugging priority๋ฅผ ์ฆ๊ฐ์์ผ์ฃผ๋ฉด ๋๋ค.
๋ฐ๋๋ผ๋ฉด ์ค๋ฅธ์ชฝ์ ๋ํ์ฃผ๋ฉด ๋๋ค.
Compression Resistance priority
์ซ์๊ฐ ํฌ๋ฉด ๋ โ์ ํญํ๊ณ ์ถ์ด == ๋ ์ ์งํ๊ณ ์ถ์ด!โ
๊ทธ๋ฐ๋ฐ ์ด๊ฒ ๋์ด ์๋๋ค. ์ ์ํฉ์์ content๋ฅผ ๊ฐ๋ ์ฑ์๋ณด์.
์คํ ๋ ์ด์์์ด ์๋ง๋ค๋ฉด์ ๋ญ๋ผ๋ญ๋ผ ํ๋ค.
์ ๋ณด๋, ๊ฐ๋ก ์ถ์ compression resistance๋ฅผ ์ค์ด๋ผ๊ณ ํ๋ค. ๊ทธ๋ผ ์ด๋ ์์ ๋๋์ฒด ๋ฌด์์ผ๊น? ์ผ๋จ ์ค์ฌ๋ณด์.
์ผ์ชฝ์ ์ ํญ๋๋ฅผ 1์ฌ๋ ธ๋๋ ๋ ธ๋์์ด ์ง์ ๊ฐ๋ฒ๋ ธ๋ค. ์ฆ, ๋ ์ปจํ ์ธ ๊ฐ ๋ค์ด์์ ๋ ํ์ด ์ธ์ง๊ฒ ๋ง๋ค์ด์ค ๊ฒ. ๋ฐ๋๋ก ์ค๋ฅธ์ชฝ์ด๋ฅผ ๋ํ๋ณด์.
์ค๋ฅธ์ชฝ์ด์ ํ์ด ๊ฐ๋ ฅํด์ก๋ค!
์ ๋ฆฌ
์ซ์๊ฐ ์ปธ์ ๋ ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌํ๋ค.
- Hugging Priority
- ๊ทธ๋ฅ ๋ ์ด์์์ด ์ ํด์ ธ์์ ๋, ๋๊ฐ ๋ ์ญ๊ตฌ๋ฆฌ์ผ?
- Compress Resistance priority
- ๋๋ค ์์ ๋ด์ฉ์ฐจ์์ผ๋ฉด ๋๊ตฐ๊ฐ๋ ์์์ ธ์ผ๋๋๋ฐ, ๊ทธ ์ํฉ์์์ ํ ์คํ
์๋ ๋ด์ฉ๊น์ง ์ดํดํด์ผ ์ ์ด๋ ๊ฒ ๋๋์ง ๋ ์์ธํ ์ดํดํ ์ ์๋ค!
Intrinsic Content Size
UILabel๋ก ์์ ์๋ฅผ ๋ค์์ง๋ง, ์ฌ์ค UILabel์ ํน์ํ ์น๊ตฌ๋ค. ์ฐ๋ฆฌ๊ฐ ์ ๋๋ก autolayout์ ์ ํ๋ ค๊ณ ํ๋ค๋ฉด ์ฌ์ค UIView๋ก ํ๋ ๊ฒ ๋ง๋ค. ์์ ๋ด์ฉ์ ์ค๋ช ํ๋ ค๊ณ ํ๋ค๋ณด๋ ๋ถ๋์ดํ๊ฒ UILabel์ ์ฌ์ฉํ๋ค.
UILabel์ด ๋ญ๊ฐ ํน๋ณํ ๊น? ์ฌ์ค ์์์ ์ฐ๋ฆฌ๋ layout์ ๊ฑธ์ด์ฃผ๋๋ฐ ์์ด์, leading, trailing, top, bottom์ 4๊ฐ๋ง ๊ฑธ์๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ label์ ์์ ๋ง์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ก๊ณ , interface builder๋ ์๋ฌด ์ค๋ฅ๋ ๋ด๋ฟ์ง ์์๋ค.
ํ์ง๋ง ์ฌ์ค ์ด์ํ์ง ์์๊ฐ? ์ด๋ป๊ฒ ์ํ์ข์ฐ์ ์์น๋ง ๊ฒฐ์ ํด์คฌ๋ค๊ณ ํด์ ํน์ view์ ํฌ๊ธฐ๊ฐ ์ ํด์ง ์ ์์๊น? ์ฌ๊ธฐ์ ํน๋ณํจ์ด ๋ฐ์ํ๋ค.
UILabel์ ์์ ๋ง์ ๊ณ ์ ํ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ์ ์๋ค. ์ฐ๋ฆฌ๋ label์ ๋ณดํต ์ฌ์ฉํ ๋, ํน์ string์ ์ ๋ ฅํด์ ์ฌ์ฉํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด string์ ํฌ๊ธฐ๋งํผ์ ์ ์ด๋ ๋ณด์ฌ์ค์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ํน์ UIView์ ํ์ ๊ฐ์ฒด๊ฐ ๊ณ ์ ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ ๊ฒ์ Intrinsic Content Size์ด๋ผ ํ๋ค.
๊ทธ๋์ ์๊น Label์ ๊ฒฝ์ฐ ์ ์ฉ๋์๋ priority๋ฅผ ๋ค์๋ณด๋ฉด ์์ ๊ฐ๋ค. hugging์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ intrinsic size์ ๋ง์ถฐ์ง๋ ค๋ ํน์ฑ์ด๊ณ , compression์ ์ด๋ฅผ ์ ์งํ๊ณ ํ์ฅํ๋ ค๋ ์์ฑ์ด๋ค.
์ข ๋ฅ
View | Intrinsic Content Size |
---|---|
UIView, NSView | ์์. |
Slider | ๋๋น(iOS)๋ง ๊ท์ ํ๋ค. ์ฌ๋ผ์ด๋์ ์ ํ(OS X)์ ๋ฐ๋ผ ๋๋น, ๋์ด ๋๋ ๋ ๋ค ์ ์ ํ์. |
Label, Button, Switch, TextField | Width, Height ๋๋ค ์์ |
TextView, ImageView | ํฌ๊ธฐ๊ฐ ๋ค์ํ ์ ์๋ค. |