iOS: UIStackView
์ด๋ฒ์ UI ๊ตฌ์ฑํ๋ฉด์ ์คํ ๋ทฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๋ค. ์ด๋ฏธ ํ ๋ฒ ๋ณธ ๋ด์ฉ์ธ๋ฐ๋, ๋ง์ ๋ค์ ํ๋ ค๋๊น ์ด๋ ต๊ณ , ํท๊ฐ๋ ค์ ๋ค์ ๊ณต๋ถํ๋ฉด์ ๋ด์ฉ์ ์ ๋ฆฌํ๋ค.
UIStackView
@MainActor class UIStackView: UIView
A streamlined interface for laying out a collection of views in either a column or a row.
์ด์ด๋ ํ์ ๋ทฐ ์ปฌ๋ ์ ์ ๋ฐฐ์นํ๊ธฐ ์ํ ๊ฐ์ํ๋ ์ธํฐํ์ด์ค์ ๋๋ค.
์ฝ๊ฒ ๋งํ๋ฉด, ๊ฐ๋ก๋ ์ธ๋ก๋ก ๋ ์ด์์์ ๋ฐฐ์นํ ๋ ์ฌ์ฉํ๋ค. ์คํ ๋ทฐ ๋ด๋ถ์ ๋ค๋ฅธ ์คํ ๋ทฐ๋ฅผ ์ค์ฒฉํด์ ๋ ๋ณต์กํ ๋ ์ด์์์ ๋ง๋ค ์ ์๋ค. Android์ LinearLayout
๊ณผ ์ ์ฌํ๋ค.
์คํ ๋ ์ด์์์ผ๋ก ์ง์ ์ก์์ค ์๋ ์๋ ๊ฑด๋ฐ, ์ด๊ฑธ ์ฐ๋ฉด ๋ญ๊ฐ ์ข๋? → ์ฅ์น์ ๋ฐฉํฅ, ํ๋ฉด ํฌ๊ธฐ, ์ฌ์ฉํ ์ ์๋ ๊ณต๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋์ ์ผ๋ก ๋ฐ์ํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
UIStackView
๋ arrangedSubviews
ํ๋กํผํฐ์ ์๋ ๋ชจ๋ ๋ทฐ์ ๋ ์ด์์์ ๊ด๋ฆฌํ๋ค. ์ถ๊ฐํ ์์๋๋ก ์คํ ๋ทฐ ๋ด์์ ์ ๋ ฌ๋๋ค.
๐ก ์ผ๋ฐ์ ์ผ๋ก ์์ ๋ทฐ์ ํ์ ๋ทฐ๋ฅผ ์ถ๊ฐํ ๋ `addSubview(_ view: UIView)` ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ `UIStackView`๋ `addArrangedSubview(_ view: UIView)`๋ฅผ ์ด์ฉํ๋ค.
์คํ๋ทฐ๋ ์ฃผ์ 4๊ฐ์ง ์์ฑ์ ์ํด ๋ ์ด์์์ด ๋ณ๊ฒฝ๋๋ค.
axis
์ํ ๋๋ ์์ง์ผ๋ก ์คํ์ ๋ฐฉํฅ์ ๊ฒฐ์ ํ๋ค. ๊ธฐ๋ณธ ๊ฐ์ ์ํ์ด๋ค.
vertical
horizontal
distribution
์คํ ๋ทฐ์ ์ถ(axis)์ ๋ฐ๋ผ ์ ๋ ฌ๋ ๋ทฐ์ ๋ ์ด์์์ ์ ์ํ๋ค. ๊ธฐ๋ณธ ๊ฐ์ fill์ด๋ค.
์ฌ์ค ์ด๊ฑฐ๋ง ๋ด์๋ ์ดํด๊ฐ ์ ๊ฐ๋๊น ํ๋ํ๋ ์ดํด๋ณด์.
fill
์คํ ๋ทฐ๊ฐ ์คํ ๋ทฐ์ ์ถ์ ๋ฐ๋ผ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต๊ฐ์ ์ฑ์ฐ๋๋ก ์ ๋ ฌ๋ ๋ทฐ(arrangedSubviews)์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ๋ ์ด์์์ด๋ค. ๊ฐ ๋ทฐ์ CHCR์ ๋ฐ๋ผ ์กฐ์ ๋๋ค. Compression Resistance์ ๋ฐ๋ผ ๋ทฐ๊ฐ ์ถ์๋๊ณ , Content Hugging์ ๋ฐ๋ผ ๋ทฐ๊ฐ ๋์ด๋๋ค. ๋ชจํธํ ๋ถ๋ถ์ด ์์ผ๋ฉด ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์กฐ์ ํ๋ค.
→ CHCR์ ์์ธํ ๋ด์ฉ์ ๋ค์ ํฌ์คํ ์์...
๊ฐ ๋ทฐ์ CHCR์ ์ฃผ์ง ์๊ณ , distribution.fill
์ ํ๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์ ์ฝ ์ฌํญ์ ์ฐพ์ ์ ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฌ๋ค. ์ด๊ฒ ์ ๋จ๋๋ฉด, ๊ฐ ๋ทฐ๋ง๋ค ๋์ด(ํน์ ๋์ด)๊ฐ ์์ด์ ๋๊ฐ ๋์ด๋์ผํ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค. ๋๊ฐ ๋์ด๋์ผ ํ ์ง ์๊ณ ์๋ค๋ฉด ์ด๋ฐ ์ค๋ฅ๋ ๋น์ฐํ ๋จ์ง ์๋๋ค.
์๋ฅผ ๋ค์ด, ์ธ ๊ฐ์ ๋ทฐ ์ค์ ๋ ๊ฐ์ ๋ทฐ์ ๋์ด๋ฅผ ์ง์ ํด์ฃผ๋ฉด ๋น์ฐํ ์์ ๊ฐ์ ์ค๋ฅ๋ ๋ฐ์ํ์ง ์๋๋ค. ์๋ํ๋ฉด ๋ ๊ฐ์ ๋ทฐ์ ๋์ด๋ฅผ ์๊ณ ์๊ธฐ ๋๋ฌธ์, ๊ณต๊ฐ์ด ๋จ๋๋ค๋ฉด ๋์ด๋ฅผ ์ง์ ํ์ง ์์ ๋ทฐ๋ฅผ ๋๋ฆฌ๋ฉด ๋๋ค๋ ๊ฑธ ์๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
fillEquality
๋ง ๊ทธ๋๋ก ๋์ผํ ๋น์จ๋ก ํฌ๊ธฐ๋ก ์ฑ์ด๋ค! axis
์ ๋์์๋ ์ฌ์ง์ ๊ตฌ์ฑ์ด fillEquality
์๋ค.
fillProportionally
์คํ ๋ทฐ์ ์ถ์ ๋ฐ๋ผ ๊ณ ์ ์ฝํ ์ธ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋น๋กํด์ ํฌ๊ธฐ๊ฐ ์กฐ์ ๋๋ค.
๊ณต์ ๋ฌธ์์๋ ๋ถ์ฐ ์ค๋ช
์ด ์์ด์ ์ดํด๊ฐ ์ ์ ๊ฐ ์ ์๋ค. fillProportionally
๊ฐ ์ ๋๋ก ๋์ํ๋ ค๋ฉด ๋ทฐ๊ฐ ๊ณ ์ ํ ์ฝํ
์ธ ํฌ๊ธฐ(intrinsicContentSize)๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก Button, Label, Slider ๋ฑ์ด ๊ฐ๊ณ ์๋ค.
์์๋ฅผ ํตํด ์์ธํ ์์๋ณด์. ๊ณ ์ ํ ์ฝํ
์ธ ํฌ๊ธฐ๋ฅผ ๊ฐ๊ณ ์๋ UILabel
๋ฅผ ๋ ๊ฐ ๋ฐฐ์นํด๋ณด๋ฉด, ๋๋ฑํ ๋น์จ๋ก ํฌ๊ธฐ๋ฅผ ๊ฐ๊ณ ์๋ ๊ฑธ ์ ์ ์๋ค.
์ด์ ์ผ์ชฝ์ ํ ์คํธ๋ฅผ ๋ ๊ธธ๊ฒ ๋ฐ๊ฟ๋ณด์. ํ ์คํธ๊ฐ ๊ธธ์ด์ง๋ฉด์ ์คํ๋ทฐ ๋ด์์ ๋ ๋ง์ ๋๋น๋ฅผ ์ฐจ์งํ๊ณ ์๋ค๋ ๊ฑธ ์ ์ ์๋ค.
์ด๋ก์ ๋ทฐ๋ ๋ ๊ธธ๊ฒ ์์ฑํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ๋ฏธ์ธํ๊ฒ ๋ ๋ง์ ๋น์จ๋ก ์ปค์ง ๊ฑธ ๋ณผ ์ ์๊ณ , ๋๋จธ์ง ํ
์คํธ๋ ...
์ผ๋ก ์ฒ๋ฆฌ๋ ๊ฑธ ์ ์ ์๋ค.
equalSpacing
์คํ ๋ทฐ์ ์ถ์ ๋ฐ๋ผ ๊ท ์ผํ ๊ฐ๊ฒฉ์ผ๋ก ๋ทฐ๋ฅผ ๋ฐฐ์นํ๋ค. ์ ๋ ฌ๋ ๋ทฐ๊ฐ ์คํ ๋ทฐ์ ๋ง์ง ์์ผ๋ฉด Compression Resistance์ ๋ฐ๋ผ ๋ทฐ๊ฐ ์ถ์๋๋ค.
UIStackView.spacing
์ ๊ฐ๊ฒฉ์ผ๋ก ๋ทฐ๋ฅผ ๋ฐฐ์นํ๋ค. spacing
๊ฐ์ด ํฌ๋ฉด ์ด๋ค ๋ทฐ๊ฐ ์์์ ธ์ผํ ์ง ์ ํด์ค์ผ ํ๋ค.
equalCentering
์คํ ๋ทฐ์ spacing ๊ฐ์ ๊ฐ๊ฒฉ์ ์ ์งํ๋ฉด์ ์คํ ๋ทฐ์ ์ถ์ ๋ฐ๋ผ ์ค์์์ ์ค์๊น์ง์ ๊ฐ๊ฒฉ์ด ๊ฐ๋๋ก ๋ฐฐ์นํ๋ค. ์ ๋ ฌ๋ ๋ทฐ๊ฐ ์คํ ๋ทฐ์ ๋ง์ง ์์ผ๋ฉด Compression Resistance์ ๋ฐ๋ผ ๋ทฐ๊ฐ ์ถ์๋๋ค.
๋ทฐ์ ์ค์ ์ถ์ ๊ธฐ์ค์ผ๋ก ๊ฐ๊ฒฉ์ ์ ์งํ๋๋ฐ, ๋ฌธ์ฅ๋ง ๋ด์ ๊ฐ์ด ์ ์ ์กํ๋ค. ๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ ๊ฒ ์ดํดํ๊ธฐ ์ฝ๋ค.
alignment
์คํ ๋ทฐ์ ์ถ์ ์์ง์ธ ๋ทฐ์ ๋ ์ด์์์ ์ ์ํ๋ค. ๊ธฐ๋ณธ๊ฐ์ fill ์ด๋ค.
alginment
๋ Axis
์ ๋ฐ๋ผ ์ ํํ ์ ์๋ ์์ฑ์ด ๋ฌ๋ผ์ง๋ค.
Vertical
- Fill
- ๋ทฐ์ ํฌ๊ธฐ๋ฅผ ์คํ ๋ทฐ์ ๋์ด ์ ์ฒด๋งํผ ์ฑ์ด๋ค.
- ๋ทฐ์ ํฌ๊ธฐ๋ฅผ ์คํ ๋ทฐ์ ๋์ด ์ ์ฒด๋งํผ ์ฑ์ด๋ค.
- Leading
- ๋ทฐ๋ฅผ ์คํ ๋ทฐ์
Leading
์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค. (์ผ์ชฝ ์ ๋ ฌ X)
- ๋ทฐ๋ฅผ ์คํ ๋ทฐ์
- Center
- ๋ทฐ๋ฅผ ์คํ ๋ทฐ์ ๊ฐ์ด๋ฐ๋ก ์ ๋ ฌํ๋ค.
- ๋ทฐ๋ฅผ ์คํ ๋ทฐ์ ๊ฐ์ด๋ฐ๋ก ์ ๋ ฌํ๋ค.
- Trailing
- ๋ทฐ๋ฅผ ์คํ ๋ทฐ์
Trailing
์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค. (์ค๋ฅธ์ชฝ ์ ๋ ฌ X)
- ๋ทฐ๋ฅผ ์คํ ๋ทฐ์
Horizontal
Vertical ์์ ์ ๋ฌ๋ฆฌ ๊ฐ์ด๋ฐ Label๋ง ์ฌ๋ฌ ์ค๋ก ์์ฑํ๋ค. ์ด๋ ๊ฒ ๊ตฌ์ฑํด์ผ ์ฐจ์ด๊ฐ ๋์ ๋๋ค.
- Fill
- ๋ทฐ์ ํฌ๊ธฐ๋ฅผ ์คํ ๋ทฐ์ ๋์ด๋งํผ ์ฑ์ด๋ค.
- ๋ทฐ์ ํฌ๊ธฐ๋ฅผ ์คํ ๋ทฐ์ ๋์ด๋งํผ ์ฑ์ด๋ค.
- Top
- ๋ทฐ๋ฅผ ์คํ ๋ทฐ์ ์๋จ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
- ๋ทฐ๋ฅผ ์คํ ๋ทฐ์ ์๋จ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
- Center
- ๋ทฐ๋ฅผ ์คํ ๋ทฐ์ ๊ฐ์ด๋ฐ๋ก ์ ๋ ฌํ๋ค.
- ๋ทฐ๋ฅผ ์คํ ๋ทฐ์ ๊ฐ์ด๋ฐ๋ก ์ ๋ ฌํ๋ค.
- Bottom
- ๋ทฐ๋ฅผ ์คํ ๋ทฐ์ ํ๋จ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
- ๋ทฐ๋ฅผ ์คํ ๋ทฐ์ ํ๋จ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
- First Baseline (only Horizontal)
- ๋ทฐ๋ฅผ first Baseline์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
- ๋ทฐ๋ฅผ first Baseline์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
- Last Baseline (only Horizontal)
- ๋ทฐ๋ฅผ last Baseline์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
- ๋ทฐ๋ฅผ last Baseline์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค.
First Baseline๊ณผ Last Baseline์ ์ฌ์ง๋ง ๋ด์๋ Top, Bottom๊ณผ ๋น์ทํด๋ณด์ด์ง๋ง ์ค์ ๋ก ์ด๋ ๋ค.
spacing
์ธ์ ํ ๋ทฐ ์ฌ์ด์ ๊ณต๊ฐ์ ํฌ๊ธฐ๋ฅผ ์ ์ํ๋ค.
equalSpacing
์ด๋ equalCentering
์์ ์ฌ์ฉํ๋ ๊ฐ๊ฒฉ์ ๊ฐ์ด๋ค.
์ฐธ๊ณ ์๋ฃ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote