๐Ÿ“ฑ [SwiftUI] Frame: ๋ทฐ์˜ ํฌ๊ธฐ ์ง€์ •

์ด์„œยท2023๋…„ 10์›” 18์ผ
0

๐Ÿ“ฑ SwiftUI ํŠธ๋ž™

๋ชฉ๋ก ๋ณด๊ธฐ
6/7

์•ˆ๋…•ํ•˜์„ธ์š” ์ด์„œ์ž…๋‹ˆ๋‹ค๐Ÿฅธ, ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” Frame modifier์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ์ž์„ธํ•˜๊ฒŒ ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค๊ณ  ํ•ด์š”!

๊ฐœ์š”

SwiftUI์—์„œ frame ์ˆ˜์ •์ž(modifier)๋Š” ๋ทฐ(view)์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ด์š”. ๋ทฐ์˜ ๋„ˆ๋น„, ๋†’์ด, ์ตœ๋Œ€/์ตœ์†Œ ํฌ๊ธฐ, ์ •๋ ฌ ๋ฐ ์œ„์น˜๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ’ก Modifier: ๊ธฐ์กด ๋ทฐ์— ์ˆ˜์ •์ž๋ฅผ ์ ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ทฐ ๋ฐ˜ํ™˜ํ•ด์š”.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

๊ณ ์ • ํฌ๊ธฐ

frame์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๊ณ  ์žˆ์–ด์š”.

func frame(
	width: CGFloat? = nil,
	height: CGFloat? = nil, 
	alignment: Alignment = .center
) -> some View

width์™€ height๋Š” ์˜ต์…”๋„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, alignment๋Š” ์˜ต์…”๋„์€ ์•„๋‹ˆ์ง€๋งŒ ๊ธฐ๋ณธ๊ฐ’์ด .center๋กœ ์ง€์ •๋˜์–ด ์žˆ์–ด ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์•„์š”.

  • width: ๋ทฐ์˜ ๋„ˆ๋น„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. nil์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•ด์š”.
  • height: ๋ทฐ์˜ ๋†’์ด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. nil์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•ด์š”.
  • alignment: ๋ทฐ์˜ ์ •๋ ฌ์„ ์ง€์ •ํ•ด์š”. Alignment ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ทฐ๊ฐ€ ์ฃผ์–ด์ง„ ๊ณต๊ฐ„ ๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ์ •๋ ฌ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•ด์š”. ๊ธฐ๋ณธ๊ฐ’์€ .center์ด๋ฉฐ, ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ๊ฐ’์œผ๋กœ .leading, .trailing, .top, .bottom, .topLeading ๋“ฑ์ด ์žˆ์–ด์š”.

๋ทฐ์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์–ด์š”. ๋”ฐ๋ผ์„œ ์ฝ˜ํ…์ธ ์˜ ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— background๋ฅผ ํŒŒ๋ž‘์ƒ‰์œผ๋กœ ์„ค์ •ํ•  ๊ฒฝ์šฐ ๋”ฑ ์ฝ˜ํ…์ธ ์˜ ํฌ๊ธฐ ๋งŒํผ ๋ฐฐ๊ฒฝ์ƒ‰์ด ์„ค์ •๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

frame ์ˆ˜์ •์ž๋ฅผ ํ†ตํ•ด ๋„ˆ๋น„์™€ ๋†’์ด์˜ ๊ฐ’์„ ์ฃผ์—ˆ์–ด์š”. ๋”ฐ๋ผ์„œ ๋ทฐ์˜ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋œ ์ƒˆ๋กœ์šด ๋ทฐ๊ฐ€ ๋ฐ˜ํ™˜๋˜์—ˆ๊ณ , ํ•ด๋‹น ๋ทฐ์— ๋ฐฐ๊ฒฝ์ƒ‰์„ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ๋œ ๋ทฐ์˜ ํฌ๊ธฐ๋งŒํผ ํŒŒ๋ž‘์ƒ‰์˜ ๋ฐฐ๊ฒฝ์ƒ‰์ด ์„ค์ •๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

๋ฐฐ๊ฒฝ์ƒ‰์„ ํŒŒ๋ž‘์ƒ‰์„ ๋ณ€๊ฒฝํ•œ ์ดํ›„์— ๋‹ค์‹œ ๋ทฐ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜์˜€์–ด์š”. ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ 300์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€์œผ๋ฉฐ, ์ด๋กœ ์ธํ•ด ๋˜ ์ƒˆ๋กœ์šด ๋ทฐ๊ฐ€ ๋ฐ˜ํ™˜๋˜์—ˆ๊ณ , ๊ฑฐ๊ธฐ์— ๋ฐฐ๊ฒฝ์ƒ‰์„ ๋นจ๊ฐ•์ƒ‰์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์€ ๋ชจ์Šต์œผ๋กœ ๋ฐ˜์˜๋˜์—ˆ์–ด์š”.

๊ฐ€๋ณ€ ํฌ๊ธฐ

func frame(
	minWidth: CGFloat? = nil,
	idealWidth: CGFloat? = nil, 
	maxWidth: CGFloat? = nil, 
	minHeight: CGFloat? = nil, 
	idealHeight: CGFloat? = nil, 
	maxHeight: CGFloat? = nil, 
	alignment: Alignment = .center
) -> some View
  1. minWidth: ๋ทฐ์˜ ์ตœ์†Œ ๋„ˆ๋น„๋ฅผ ์ง€์ •ํ•ด์š”. ๋ทฐ์˜ ์ตœ์†Œ ๋„ˆ๋น„๋ณด๋‹ค ์ฝ˜ํ…์ธ  ๋„ˆ๋น„๊ฐ€ ์ž‘์œผ๋ฉด ์ž๋™์œผ๋กœ minWidth๋กœ ์„ค์ •๋ผ์š”. ๋งŒ์•ฝ ์ฝ˜ํ…์ธ ์˜ ๋„ˆ๋น„๊ฐ€ minWidth๋ณด๋‹ค ํฌ๋ฉด ์ฝ˜ํ…์ธ ์˜ ๋„ˆ๋น„๊ฐ€ ๋ทฐ์˜ ๋„ˆ๋น„๊ฐ€ ๋ผ์š”.
  2. maxWidth: ๋ทฐ์˜ ์ตœ๋Œ€ ๋„ˆ๋น„๋ฅผ ์ง€์ •ํ•ด์š”. ์ฝ˜ํ…์ธ ๊ฐ€ ์ตœ๋Œ€ ๋„ˆ๋น„๋ณด๋‹ค ํฌ๋”๋ผ๋„ ๋ทฐ์˜ ํฌ๊ธฐ๋Š” maxWidth๋ฅผ ์œ ์ง€ํ•ด์š”.
  3. minHeight: ๋ทฐ์˜ ์ตœ์†Œ ๋†’์ด๋ฅผ ์ง€์ •ํ•ด์š”. ๋ทฐ์˜ ์ตœ์†Œ ๋†’์ด ๋ณด๋‹ค ์ฝ˜ํ…์ธ  ๋†’์ด๊ฐ€ ์ž‘์œผ๋ฉด ์ž๋™์œผ๋กœ minHeight๋กœ ์„ค์ •๋ผ์š”. ๋งŒ์•ฝ ์ฝ˜ํ…์ธ ์˜ ๋†’์ด๊ฐ€ minHeight๋ณด๋‹ค ํฌ๋ฉด ์ฝ˜ํ…์ธ ์˜ ๋†’์ด๊ฐ€ ๋ทฐ์˜ ๋†’์ด๊ฐ€ ๋ผ์š”.
  4. maxHeight: ๋ทฐ์˜ ์ตœ๋Œ€ ๋†’์ด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ ๊ฐ€ ์ตœ๋Œ€ ๋†’์ด ๋ณด๋‹ค ํฌ๋”๋ผ๋„ ๋ทฐ์˜ ํฌ๊ธฐ๋Š” maxHeight๋ฅผ ์œ ์ง€ํ•ด์š”.

์ •๋ ฌ

frame ์ˆ˜์ •์ž์˜ alignment ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ทฐ์˜ ์ •๋ ฌ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ์š”. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ทฐ์˜ ํฌ๊ธฐ๊ฐ€ ์„ค์ •๋˜๊ณ  ๋‚จ๋Š” ๊ณต๊ฐ„์ด ์žˆ์„ ๋•Œ ๋ทฐ๋ฅผ ํ•ด๋‹น ๊ณต๊ฐ„ ๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ์ •๋ ฌํ• ์ง€๋ฅผ ์ง€์ •ํ•ด์š”. alignment์€ Alignment ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ์ •๋ ฌ ์˜ต์…˜์„ ์ œ๊ณตํ•ด์š”.

  1. .center: ๋ทฐ๋ฅผ ๊ฐ€์šด๋ฐ ์ •๋ ฌํ•ด์š”. ์ˆ˜ํ‰๊ณผ ์ˆ˜์ง์œผ๋กœ ์ค‘์•™์— ์œ„์น˜ํ•˜๋„๋ก ํ•ด์š”. (๊ธฐ๋ณธ๊ฐ’)
  2. .leading: ๋ทฐ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ์ •๋ ฌํ•ด์š”. ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์—์„œ ์™ผ์ชฝ์— ์œ„์น˜ํ•˜๊ฒŒ ๋ผ์š”.
  3. .trailing: ๋ทฐ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ •๋ ฌํ•ด์š”. ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์—์„œ ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜ํ•˜๊ฒŒ ๋ผ์š”.
  4. .top: ๋ทฐ๋ฅผ ์œ„์ชฝ์œผ๋กœ ์ •๋ ฌํ•ด์š”. ์ˆ˜์ง ๋ฐฉํ–ฅ์—์„œ ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๊ฒŒ ๋ผ์š”.
  5. .bottom: ๋ทฐ๋ฅผ ์•„๋ž˜์ชฝ์œผ๋กœ ์ •๋ ฌํ•ด์š”. ์ˆ˜์ง ๋ฐฉํ–ฅ์—์„œ ํ•˜๋‹จ์— ์œ„์น˜ํ•˜๊ฒŒ ๋ผ์š”.
  6. .topLeading: ๋ทฐ๋ฅผ ์ขŒ์ƒ๋‹จ์œผ๋กœ ์ •๋ ฌํ•ด์š”. ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์—์„œ ์™ผ์ชฝ, ์ˆ˜์ง ๋ฐฉํ–ฅ์—์„œ ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๊ฒŒ ๋ผ์š”.
  7. .topTrailing: ๋ทฐ๋ฅผ ์šฐ์ƒ๋‹จ์œผ๋กœ ์ •๋ ฌํ•ด์š”. ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์—์„œ ์˜ค๋ฅธ์ชฝ, ์ˆ˜์ง ๋ฐฉํ–ฅ์—์„œ ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๊ฒŒ ๋ผ์š”.
  8. .bottomLeading: ๋ทฐ๋ฅผ ์ขŒํ•˜๋‹จ์œผ๋กœ ์ •๋ ฌํ•ด์š”. ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์—์„œ ์™ผ์ชฝ, ์ˆ˜์ง ๋ฐฉํ–ฅ์—์„œ ํ•˜๋‹จ์— ์œ„์น˜ํ•˜๊ฒŒ ๋ผ์š”.
  9. .bottomTrailing: ๋ทฐ๋ฅผ ์šฐํ•˜๋‹จ์œผ๋กœ ์ •๋ ฌํ•ด์š”. ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์—์„œ ์˜ค๋ฅธ์ชฝ, ์ˆ˜์ง ๋ฐฉํ–ฅ์—์„œ ํ•˜๋‹จ์— ์œ„์น˜ํ•˜๊ฒŒ ๋ผ์š”.

profile
๐ŸŽ๏ธ๐Ÿ’จ Beep Beep

0๊ฐœ์˜ ๋Œ“๊ธ€