SwiftUI ๋ UIKit ๊ณผ ๋น์ทํ๊ฒ iOS ์ฑ์ UI ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํ ํ๋ ์์ํฌ์ ๋๋ค. iOS13 ๋ถํฐ ์ฌ์ฉ๊ฐ๋ฅํ์ง๋ง iOS14 ์ด์๋ถํฐ ๊ฐ๋ฅํ ๊ธฐ๋ฅ๋ค์ด ๋ง์, ๋ฏธ๋๋ฉ iOS14 ์์ ์ฃผ๋ก ์ฌ์ฉํ๋ ๊ฑธ๋ก ์๊ณ ์์ต๋๋ค! ๋ค์ ์ฌ์ด๋ํ๋ก์ ํธ๋ ํด๋ก ์ฝ๋ฉ์ SwiftUI ๋ก ๊ผญ ํด๋ด์ผ๊ฒ ์ด์!! ๊ทธ๋ฌ๊ธฐ ์ํ ์คํฐ๋ ์์~! ๐ช
SwiftUI ์ ๋ํ ํน์ง
- ์ ์ธ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํด ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๊ธฐ๋ฅ์ ๋ช ์ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
- ๋๋๊ทธ ์ค ๋๋กญ์ผ๋ก UI ๋ฅผ ๊ตฌ์ฑํ ์ ์๊ณ , ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ๊ฐ๋ฅํ ์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค. (๊ณผ์ฐ ์์ฃผ์ธ์ง ์๋ฌธ์ด์ง๋ง์)
- ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ์์ฑ์ ๋ฉ์๋ ์ฒด์ด๋(Method Chaining) ๋ฌธ๋ฒ์ ์ด์ฉํด ์ค์ ํฉ๋๋ค.
View ํ๋กํ ์ฝ์ Instance method ๋ฅผ ๋ณด๋ฉด ๋ฐํ๊ฐ์ด View ์ธ๊ฒ์ ํ์ธํ์ค ์ ์์ด์. ๋ฉ์๋๊ฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํด ์ฌ๋ฌ ๋ฉ์๋๋ฅผ ์์ฐจ์ ์ผ๋ก ์ ์ธํ ์ ์๋ ๊ฒ์ ๋๋ค! (๋์ค์ ํ๋ฒ ์ ๋ฆฌํด๋ด์ผ๊ฒ ์ด์) ๊ด๋ก์ ์ผ๋ก ๊ฐ์ฒด์ ์ ์ธ๊ณผ ์ค์ ์ ์ํฐ๋ก ๊ตฌ๋ถํด ์์ฑํ๋ค๊ณ ํฉ๋๋ค.
View Protocol
- View ํ๋กํ ์ฝ์ ์ฑ์ UI ๋ฅผ ํํํ๊ณ , view ๋ฅผ ์ค์ ํ๊ธฐ ์ํ modifiers ๋ฅผ ์ ๊ณตํ๋ ํ์ ์ ๋๋ค.
- Stack, Button, Text, Image, List, Spacker ๋ชจ๋ View ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ์์ต๋๋ค.
- View ํ๋กํ ์ฝ์ ์ฑํํด ์ปค์คํ ํ View ๋ฅผ ๋ง๋ค ์ ์์ด์. computed property ์ธ body ๋ ๋ฐ๋์ ๊ตฌํํด์ผ ํฉ๋๋ค. body ๋ฅผ ํตํด ์ปค์คํ ํ ๋ทฐ์ ๋ด์ฉ์ ์ฑ์์ฃผ๋ ๊ฒ์ด์์. body ๋ด๋ถ์๋ ์ฌ๋ฌ ๋ทฐ๋ค์ ์ถ๊ฐํด์ค ์ ์์ต๋๋ค.
๐ https://developer.apple.com/documentation/swiftui/view
๐ Building Layouts with Stack Views
SwiftUI ์์๋ View ๋ฅผ ๋ฐฐ์นํ๊ธฐ ์ํด์ Stack View ๋ฅผ ์ด์ฉํฉ๋๋ค. HStack, VStack, ZStack ์ธ๊ฐ์ง๊ฐ ์๋๋ฐ XYZ ์ถ ๊ธฐ๋ฐ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ผ์. Stack ๋ด๋ถ์๋ View ๋ฅผ ๋ฐฐ์นํ ์ ์๊ณ , Stack ๋ํ ๋ฐฐ์นํ ์ ์์ต๋๋ค! (Stack ๋ View ํ๋กํ ์ฝ์ ์ฑํํ๊ธฐ ๋๋ฌธ)
- HStack : Horizontal Stack, ๊ฐ๋ก๋ก ํ์ ๋ทฐ๋ค์ ๋ฐฐ์นํฉ๋๋ค.
- VStack : Vertical Stack, ์ธ๋ก๋ก ํ์ ๋ทฐ๋ค์ ๋ฐฐ์นํฉ๋๋ค.
- ZStack : Z ์ถ์์ ํ์ ๋ทฐ๋ค์ ์ฐ๋ฌ์ ๋ฐฐ์นํ๋ค. ๋จผ์ ์ ์ธ๋ ๋ทฐ๋ ๊ฐ์ฅ ํ๋จ์ ๊น๋ฆฌ๊ณ , ๊ทธ ์๋ก ๋ทฐ๋ค์ด ๋ฐฐ์น๋ฉ๋๋ค.
๐ https://developer.apple.com/documentation/swiftui/building-layouts-with-stack-views
Stack ์์ฑ์
// Horizontal Stack
// VerticalAlignment - top, center, bottom, firstTextBaseline, lastTextBaseline
HStack(alignment: VerticalAlignment = .center, spacing: CGFloat? = nil, content: () -> Content)
// Vertical Stack
// HorizontalAlignment - leading, center, trailing
VStack(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil, content: () -> Content)
// Z-axis
// Alignment - topLeading, top, topTrailing, leading, center, trailing, bottomLeading, bottom, bottmTrailing
ZStack(alignment: Alignment = .center, content: () -> Content)
- alignment ๋ฅผ ๊ฐ๋ ๊ฑด ๋์ผํ์ง๋ง, HStack ์ ๊ฐ๋ก๋ก ๋ฐฐ์น๋๋ ์ค ์ธ๋ก์ ์ ๋ ฌ์ ๊ธฐ์ค์ก๊ณ , VStack ์ ์ธ๋ก๋ก ๋ฐฐ์น๋๋ ์ค ๊ฐ๋ก์ ์ ๋ ฌ์ ๊ธฐ์ค ์ก๊ณ , ZStack ์ ๊ฐ๋ก ์ธ๋ก ๋ ๋ค ์ ๋ ฌ์ ๊ธฐ์ค์ก๋ ์ ์ด ๋ค๋ฆ ๋๋ค.
- spacing ์ ๊ธฐ๋ณธ๊ฐ์ nil ์ด์ง๋ง, 0์ผ๋ก ์ค์ ๋๋๊ฒ ์๋ ์๋ธ๋ทฐ๋ค ์กฐํฉ์ ๋ฐ๋ฅธ ๊ธฐ๋ณธ ๊ฐ์ด ์ค์ ๋ฉ๋๋ค! ์๋ํ์ง ์์ ๋น์นธ์ด ์๋ค๋ฉด spacing ์ ์กฐ์ ํด๋ณด์ธ์ ๐
View - Instance Method
Layout ์ค์ ์ ๋ํ ๋ฉ์๋, ์ ๊ทผ์ฑ ์ ๊ณต ๋ฐ Input ์ด๋ Event ์ค์ ํ ์ ์๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ณ ์์ด์. ์์ง ๋ง์ด ์ฌ์ฉํด๋ณด์ง ์์์, ๊ฐ์๋ค์ผ๋ฉด์ ๋์จ ๋ช๊ฐ๋ง ์ ๋ฆฌํด๋๊ฒ์!
// ํน์ ์ฌ์ด์ฆ๋ก ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ ๋ฉ์๋
// width, height ๊ฐ nil ์ธ ๊ฒฝ์ฐ๋ ๊ฐ๋ฅํ ์ต๋ ์ฌ์ด์ฆ๋ก ์ง์ ๋๋ค.
func frame(width: CGFloat? = nil, height: CGFloat? = nil, alignment: Alignment = .center) -> some View
// safe area ๋ฐ์ผ๋ก ๋ทฐ๋ฅผ ๋ฐฐ์นํ๊ธฐ ์ํ ๋ฉ์๋
// ๋ทฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก safe area ๋ด๋ถ์ ๋ฐฐ์น๋๋ค.
func ignoresSafeArea(_ regions: SafeAreaRegions = .all, edges: Edge.Set = .all) -> some View
// ๋ทฐ์ ์ฃ์ง ์ ์ฒด์ ์ผ์ ํ ํจ๋ฉ์ ๋ํ๋ ๋ฉ์๋
func padding(_ length: CGFloat) -> some View
// ๋ทฐ์ ํน์ ์ฃ์ง์ ์ผ์ ํ ํจ๋ฉ์ ๋ํ๋ ๋ฉ์๋
// length ๊ฐ nil ์ผ ๊ฒฝ์ฐ, ํ๋ซํผ์์ ์ง์ ํ ๊ธฐ๋ณธ ๊ฐ์ ์ฌ์ฉํ๋ค.
func padding(_ edges: Edge.Set = .all, _ length: CGFloat? = nil) -> some View
// ๋ทฐ์ ํน์ ์ฃ์ง๋ง๋ค ๋ค๋ฅธ ํจ๋ฉ๊ฐ์ ๋ํ๋ ๋ฉ์๋
func padding(_ insets: EdgeInsets) -> some View
frame ๋ฉ์๋
View.frame ๋ฉ์๋๋ ํน์ ์ฌ์ด์ฆ๋ก ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ ๋ฉ์๋์์.
width, height ๊ฐ nil ์ธ ๊ฒฝ์ฐ๋ ๊ฐ๋ฅํ ์ต๋ ์ฌ์ด์ฆ๋ก ์ง์ ๋ฉ๋๋ค! ํ๋์๊ณผ ์ฃผํฉ์ ํ์์ ๋ณด๋ฉด ๋น๊ต๊ฐ ๋ ๊ฑฐ์์.
ZStack ํ์ฉ & ignoresSafeArea ๋ฉ์๋
View ๋ ๊ธฐ๋ณธ์ ์ผ๋ก safe area ๋ด๋ถ์ ๋ฐฐ์น๋๊ธฐ ๋๋ฌธ์, ๋ ธ์น๋ ํ๋จ ๋ฐ๋ฅผ ๋ฎ๋๋ก ๋ฐฐ์นํ๊ณ ์ถ๋ค๋ฉด, ignoresSafeArea ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ฃผ๋ฉด ๋ฉ๋๋ค! ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ด ๋ค๋ฅธ์ ์ ๋ณด์ค ์ ์์๊ฑฐ์์.
๊ทธ๋ฆฌ๊ณ ์๋ ์ฝ๋์์ ์์์ ์ ํ๊ธฐ ์ํด์๋ ZStack ์ ์ด์ฉํ๋ ์ ๋ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค! UIKit ์์ addSubview ๋ก ์ฌ์ฉ๋๋ ๊ฑธ ZStack ์ ์ฌ์ฉํด์ ์ข๋ ๋ช ํํ๊ฒ ๋ํ๋ผ์๊ฐ ์๋ ๊ฒ ๊ฐ์์ ๐
View padding & background
๋ทฐ์ ๋ํด padding, background ๋ฅผ ํจ๊ป ์ ์ฉํ ๋๋ ์์์ ์ ์ํด์ผํฉ๋๋ค! ๋ฉ์๋๋ฅผ ์ ์ฉํ๊ณ ๋ฐํ๋ ๊ฐ์ฒด์ ๋ค์ ๋ฉ์๋๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์์์๋ ์์ด์.
background > padding ๋ text ์ background ์ค์ ๋ ํ padding ์ ์ฉ์ด๋ฏ๋ก padding ์์ญ์๋ ์์์ด ์๊ฒ ๋ฉ๋๋ค! padding ๊น์ง ์์์ ์ง์ ํ๊ณ ์ถ๋ค๋ฉด, padding > background ์์๋ก ์ค์ ํด์ผํด์ ๐ฎ
์ฐธ๊ณ ๋ฌธ์
'๐ iOS > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS/SwiftUI] @Environment ์์๋ณด๊ธฐ / ๋ชจ๋ฌ ๋ทฐ ๋ซ๊ธฐ dismiss ํ์ฉ (0) | 2023.06.15 |
---|---|
[iOS/SwiftUI] @ViewBuilder, @resultBuilder ๊ฐ ๋ฌด์์ผ๊น? (0) | 2023.06.07 |
[iOS] SwiftUI LazyVStack LazyHStack :: lazy load views (1) | 2022.06.07 |
[iOS] SwiftUI property wrapper @State @Binding (0) | 2022.06.02 |
[iOS/SwiftUI] Text, Image ๊ธฐ๋ณธ ์ ๋ฆฌ + ์์คํ ์ด๋ฏธ์ง (0) | 2022.05.05 |