HACKING WITH SWIFT - Guess the Flag
๐ง๐ป์ด๋ฒ ์๊ฐ์๋ WeSplit ์ดํ ์๋ก์ด ํ๋ก์ ํธ๋ก ํ๋ฒ Swift์ ๋ํด ์์๋ณด์!
์ด๋ฒ ํ๋ก์ ํธ์ ์ด๋ฆ์ "Guess the Flag"๋ก ๋ง ๊ทธ๋๋ก ์ฌ์ฉ์๊ฐ ๋ฌธ์ ๋ก ์ ์๋ ๊ตญ๊ฐ์ ๊ตญ๊ธฐ๋ฅผ ๋ง์ถฐ๋ณด๋ ๊ฐ๋จํ ์ฑ์ด๋ค.
์ด๋ฅผ ํตํด VStack, Image, LinearGradient ๋ฑ์ ์ฃผ๋ก ๋ค๋ฃจ๋ฉด์ ์ ์ฒด์ ์ธ ์ฑ์ ๋ง๋ค์ด ๋ณด์!
VStack.
Xcode์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ฐ์ด์์ TextView์ ๋ํด์๋ ํ๋์ view์์ ๊ฐ๊ฐ ํ์๋๋๋ฐ ๋ง์ฝ ๋ ๊ฐ์ TextView๊ฐ ํ ํ์ด์ง ์์ ๊ฐ์ด ์ถ๋ ฅ๋๊ธธ ๋ฐ๋๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น??
var body: some View {
Text("Hello, world!")
Text("This is another text view")
}
์๋ง ์ด๋ ๊ฒ ์ฝ๋ฉ์ ํด๋ณด๋ฉด ์บ๋ฒ์ค๋ฅผ ํตํด ๋๊ฐ์ ๋ค๋ฅธ ๋ทฐ๋ก ์ถ๋ ฅ๋๊ณ ์๋ค๋ ๊ฒ์ ์ฝ๊ฒ ํ์ธํ ์ ์๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ VStack ์ ์ด์ฉํ๋ฉด ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ค. ์ฌ๊ธฐ์ V๋ vertical, ์ฆ ์์ง์ ์๋ฏธํ๊ณ ์๋ค. ๋ฐ๋ผ์ VStack์์ 2๊ฐ์ Text๋ฅผ ์๋์ ๊ฐ์ด ๋ฃ์ด ๋ณด๋ฉด
VStack {
Text("Hello, world!")
Text("This is inside a stack")
}
ํ ํ์ด์ง ์์ ๋๊ฐ์ Text๊ฐ ํจ๊ป ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ฌ๊ธฐ์ VStack์ ์์ฑ์ ์ถ๊ฐํ์ฌ ๋์ฑ ์ด์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ง๋ค.
- spacing์ ์ด์ฉํ์ฌ ๊ฐ๊ฒฉ์ ์ ์ด ํ ์ ์๋ค.
- alignment๋ฅผ ์ด์ฉํ์ฌ ์ ๋ ฌ์ ์ ์ด ํ ์ ์๋ค.
//VStack(spacing: 20)
//VStack(alignment: .leading)
์์ ๊ฐ์ด ์์ฑ์ ์ด์ฉํ์ฌ ์์ ์ด ํ์ํ ์์ฑ์ ํธํ๊ฒ ๊ฐ์ ธ๋ค ์ธ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ VStack๋ด๋ถ์ ์ค๊ฐ ์ค๊ฐ spacer๋ฅผ ์ด์ฉํ๋ฉด ํ์ชฝ์ผ๋ก ํธ์ํ ์ ์๋ค. ๋ง์ฝ ๋ด๊ฐ spacer๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํ๋ฉด ์์ชฝ ๊ณต๊ฐ์ 1/3์ ์๋์ชฝ์ 3/2๋ฅผ ๊ฐ์ง ์ ์๋ค.
VStack {
Spacer()
Text("First")
Text("Second")
Text("Third")
Spacer()
Spacer()
}
HStack, ZStack
VStack๊ณผ ๋ฐ๋๋ก ์ด๋ฒ์๋ ๊ฐ๋ก ์ฆ ์ํ์ผ๋ก ๋ฐฐ์ด ํ ์ ์๋ค. ์ฌ๊ธฐ์ ์์์ ์ธ๊ธํ ์์ฑ spacing์ ๊ทธ๋๋ก ์ฌ์ฉํด๋ณผ ์๋ ์๋ค.
ZStack์ ๊น์ด์ ๋ฐ๋ผ ์ ๋ ฌ์ ํ๊ฒ ๋๋๋ฐ ๊ฒน์ณ๋ณด์ด๊ฒ ๋๋ฉด์ ํ ์คํธ๋ฅผ ์ฝ๊ธฐ์๋ ๋ค์ ์ด๋ ค์์ง๋ค. ๊ทธ๋์ ZStack์ ๊ฒฝ์ฐ ๊ฐ๊ฒฉ ๊ฐ๋ ์ด ์๊ณ ์ ๋ ฌ์ ๊ฐ๋ ์ ์๊ฒ ๋๋ค. ์ด๊ฑธ ์ด์ฉํด์ ์ด๋ฏธ์ง์ ํ ์คํธ๋ฅผ ๊ฒน์ณ ๋ณด์ด๊ฒ ํ ๋ ๋์ฑ ๊ฐ์กฐํ๊ณ ์ถ์ ๊ฒ์ ์ํ๋ ๋๋ก ํํํ ์ ์๊ฒ ๋๋ค.
SwiftUI์์๋ ์์์ ๋ ๋๋ง ํ ์์๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ด๋ฅผ ZStack์ ์ด์ฉํด์ ํ๋ฒ ํํํด๋ณด์
//1
ZStack {
Text("Your content")
}
.background(.red)
//2
ZStack {
Text("Your content")
.background(.red)
}
์์ ๋งํ ๋๋ก ํ ์คํธ ๋ค์ ๋ฌด์ธ๊ฐ, ์๋ฅผ ๋ค๋ฉด ์์์ ๋ฃ๊ณ ์ถ์ ๋๋ ์ด๋ป๊ฒ ํ ๊น??
ํ ๊ฐ์ง ์ต์ ์ด ์๋๋ฐ ์ฌ๊ธฐ์๋ .background()๋ฅผ ํตํด ๊ทธ๋ฆด ์์์ ์ง์ ํ ์ ์๋ค. ์ฝ๋๋ฅผ ์บ๋ฒ์ค๋ฅผ ํตํด ํ์ธ ํด๋ณธ๋ค๋ฉด ์๋ง ์ฒซ๋ฒ์งธ์ ๋๋ฒ์งธ ์ฝ๋๊ฐ ์กฐ๊ธ ๋ค๋ฅด์ง๋ง ๊ฒฐ๊ณผ์์ผ๋ก๋ ๋ค๋ฅธ๊ฒ์ด ์๋ค.
์ด๋ฒ์๋ ๊ทธ๋ผ ํ ์คํธ ๋ค ์ ์ฒด ์์ญ์ ๋นจ๊ฐ์์ผ๋ก ์ฑ์๋ณด์. ์ด๋ Color.red๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ฌ๊ธฐ์ Color.red๋ ๊ทธ ์์ฒด๋ก ํ๋์ view์ด๊ธฐ ๋๋ฌธ์ ๋ชจ์๊ณผ ํ ์คํธ์ฒ๋ผ ์ฌ์ฉํ ์์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ํ frame()์ ์ฌ์ฉํ์ฌ ํน์ ํฌ๊ธฐ๋ก ์ค์ ํด๋ณผ ์ ์๋ค. 200 * 200 ์ ์ฌ๊ฐํ์ ์์ญ์๋ง ๋นจ๊ฐ์์ ์น ํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํด๋ณผ ์ ์๋ค.
Color.red
.frame(width: 200, height: 200)
์ํ๋ ๋ ์ด์์์ ๋ฐ๋ผ ์ต์ ๋ฐ ์ต๋ ๋๋น์ ๋์ด๋ฅผ ์ง์ ํ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด ๋์ด๊ฐ 200 ์ดํ์ธ ์์์ ์ํ์ง๋ง ๋๋น๋ ๋๋น๊ฐ ์ต์ 200ํฌ์ธํธ ์ฌ์ผ ํ์ง๋ง ๋ค๋ฅธ ํญ๋ชฉ์์ ์ฌ์ฉ๋์ง ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๋๋น๋ฅผ ์ฑ์ฐ๊ธฐ ์ํด ๋๋ฆด ์ ์๋ ์์์ ์ํ๋ค๊ณ ๋งํ ์ ์๋ค.
Color.red
.frame(minWidth: 200, maxWidth: .infinity, maxHeight: 200)
๊ธฐ์กด์ ์ฐ๋ฆฌ๋ ์์์ผ๋ก blue, orange, green ๋ฑ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ์ข ๋ฅ์ ์์ ๋ํด์ ์๊ณ ์๋ค. SwiftUI์์๋ ์ด๋ฟ๋ง ์๋๋ผ Segmentic Color๊ฐ ์๋ค. ์ด๋ ์ค๋ช ํ๊ธฐ ๋ชจํธํ ์ ์ด ๋ง์ผ๋ ๋ฐ๋ก ์์๋ฅผ ๋ค์ด๋ณด๋ฉด
- Color.primary : SwiftUI์ ๊ธฐ๋ณธ ํ ์คํธ ์์์ด๋ฉฐ ์ฌ์ฉ์์ ์ฅ์น๊ฐ ๋ฐ์ ๋ชจ๋์์ ์คํ ์ค์ธ์ง ์ด๋์ด ๋ชจ๋์์ ์คํ ์ค์ธ์ง์ ๋ฐ๋ผ ๋ณํ๊ฒ ๋๋ค.
- Color.secondary : ๋ณด์กฐ ์ฝํ ์ธ ์ ์ฌ์ฉํ ์์์ผ๋ก ์ฝ๊ฐ์ ํฌ๋ช ๋๊ฐ ์์ด ๋ค์ ์๋ ์์์ด ์ฝ๊ฐ ๋น์น๋ค. ํ๋ง๋๋ก ์กฐ๊ธ ์์ด ์ฐํด? ์ง๋ ๋๋์ด๋ค.
ํน์ ์์์ด ํ์ํ ๊ฒฝ์ฐ rgb๊ฐ์ ์ด์ฉํ์ฌ 0๊ณผ 1 ์ฌ์ด์ ๊ฐ์ ์ ๋ฌํด ์ฌ์ฉ์ ์ง์ ์์์ ๋ง๋ค ์๋ ์๋ค.
Color(red: 1, green: 0.8, blue: 0)
์ด๋ฒ์๋ ์ด์ ํ๋ก์ ํธ์์๋ ์ ๊น ๋์๋ ์์ ์์ญ์๋ ์๋ฆฌ์ง ์๊ณ ๊ทธ๋ฆด ์ ์๋์ง๋ ๋ณด์.
ZStack {
Color.red
Text("Your content")
}
.ignoresSafeArea()
๋ค์๊ณผ ๊ฐ์ด .ignoresSafeArea()์ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ด๋ ์์ ์์ญ์ ๋ํด ์๋ฌด ์ ์ฝ ์์ด ์ ๊ทผ ๊ฐ๋ฅ ํ์ง๋ง ์ฌ์ฉ์๊ฐ ๋ณด๊ธฐ์๋ ๋ฑํ ์ข์ง๋ ์๋ค. ๋ฐ๋ผ์ ์ค์ํ ์ฝํ ์ธ ๊ฐ ์๋๋ผ๋ฉด ์์ ์์ญ ์ธ๋ถ์ ๋๋ ๊ฒ์ ๋ณ๋ก ์ข์ง ์์ ๊ฒ ๊ฐ๋ค.
์์์ ๋ฐฐ์ด ๊ฒ์ ํ๋ฒ ์ ์ฒด์ ์ผ๋ก ์ ๋ฆฌํ ๊ฒธ ํ๋ฒ ์ํ๋ ๋๋ก ๋ง๋ค์ด์ ์ด๋ป๊ฒ ๋๋์ง ๋ณด์.
ZStack {
VStack(spacing: 0) {
Color.red
Color.blue
}
Text("Your content")
.foregroundColor(.secondary)
.padding(50)
.background(.ultraThinMaterial)
}
.ignoresSafeArea()
์ฝ๋ ๋ถ๋ถ์ ํ๋์ฉ ์ดํด๋ณด๋ฉด ZStack๋ด๋ถ์ VStack์ ๋ฐฐ์นํด๋๊ณ ์ดํ ๊ทธ ๋ด๋ถ์ ๋ค์ ๋ ๊ฐ์ง ์์์ ๋ฐฐ์นํ์ฌ ๋ถํ ํ์๋ค. ๊ทธ๋ฐ ๋ค์ ํ ์คํธ ๋ทฐ์ ์์ ์ foregroundColor()๋ฅผ ์ถ๊ฐํด ๊ธ์ ์์ฒด์ ์์์ ํ์์ผ๋ก ๋ฐ๊ฟ๋ณด์๊ณ , ๊ทธ ๋ฐ๋ก ๋ค์ ๋งค์ฐ ์์ ๋ญ๊ฐ ๋ถํฌ๋ช ํ ๋๋์ ์์์ ํ๋ ๋ ๋ฐฐ์นํ์๋๋ฐ ์ด๋. ultraThinMaterial์ ๋ฐฐ๊ฒฝ์์ผ๋ก ์ฌ์ฉํ์ฌ์ ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์์๋ค.
๋ํ ๋ฐ๋ก ์์์ ๋ฐฐ์ด ignoresSafeArea์ ์ด์ฉํ์ฌ ์์ ์์ญ์ ๋ฒ์ด๋๊ฒ๋ ํด๋ณด์๋ค.
Gradients.
SwiftUI๋ ์์ ํ 3๊ฐ์ง ์ข ๋ฅ์ ๊ทธ๋ผ๋์ธํธ๋ฅผ ์ ๊ณตํ๋ฉฐ ์์๊ณผ ๊ฐ์ด UI์์ ๊ทธ๋ฆด ์ ์๋ ๋ทฐ์ด๋ค.
๊ตฌ์ฑ ์์
- ํ์ํ ์์ ๋ฐฐ์ด
- ํฌ๊ธฐ ๋ฐ ๋ฐฉํฅ ์ ๋ณด
- ์ฌ์ฉํ ๊ทธ๋ผ๋์ธํธ ์ ํ
๊ทธ๋ ๋์ธํธ์ ์ข ๋ฅ๋ ํฌ๊ฒ 3๊ฐ์ง๋ก ๋๋๊ฒ ๋๋ค.
- ์ ํ ๊ทธ๋ ๋์ธํธ
- ๋ฐฉ์ฌํ ๊ทธ๋ ๋์ธํธ
์๋ฅผ ๋ค์ด ์ ํ ๊ทธ๋ ๋์ธํธ๋ ํ์ชฝ ๋ฐฉํฅ์ผ๋ก ์งํ๋๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์์์ ๊ณผ ๋์ ์ ์ ๊ณตํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณผ ์ ์๋ค.
LinearGradient(gradient: Gradient(colors: [.white, .black]), startPoint: .top, endPoint: .bottom)
๋ฐฉ์ฌํ ๊ทธ๋ ๋์ธํธ๋ ์ ๋ชจ์์ผ๋ก ๋ฐ๊นฅ์ชฝ์ผ๋ก ์ด๋ํ๊ธฐ ๋๋ฌธ์ ๋ฐฉํฅ์ ์ง์ ํ๋ ๋์ ์์๊ณผ ๋ ๋ฐ๊ฒฝ์ ์ง์ ํ๋ค. ์์๋ก ๋ฐ๋ก ํ์ธํด๋ณด์
RadialGradient(gradient: Gradient(colors: [.blue, .black]), center: .center, startRadius: 20, endRadius: 200)
๋ง์ง๋ง ์๋ฟํ ๊ทธ๋ ๋์ธํธ๋ ๋ฐ๊นฅ์ชฝ์ผ๋ก ๋ฐฉ์ฌ๋์ง ์๊ณ ์์ ์ค์ฌ์ผ๋ก ์์์ด ์ํ๋์ด์ ์๊ฐ๋ณด๋ค ์๋ฆ๋ค์ด ํจ๊ณผ๋ฅผ ํํํ ์ ์๋ค.
Buttons and images.
์ด์ ์ SwiftUI์ ๋ฒํผ์ ๊ฐ๋ตํ๊ฒ ์ดํด๋ณด์๊ณ ๊ด๋ฒ์ํ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด์๋ ์ ์ํ ์ ์์๋ค. ์ด๋ฒ์๋ ๋ฒํผ์ ์๊ฐ์ ํจ๊ณผ๋ฅผ ๋ถ์ฌํด๋ณด๋ ๊ณผ์ ์ ๋ํด์ ์์๋ณด์.
๊ฐ์ฅ ๋จผ์ ๋ฒํผ์ ๋ด์ฅ๋ ์คํ์ผ ์ค ํ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์๋ฅผ ๋ค๋ฉด .bordered๊ณผ .borderedProminent๊ณผ ๊ฐ์ด ๋ฒํผ์ ์ฐจ๋ณ์ ์ ๋ถ์ฌํด๋ณผ ์ ์๋ค. ์์๋ก ํ๋ฒ ์คํ์ผ์ ๋ณํ๋ฅผ ์ฐพ์๋ณด์.
VStack {
Button("Button 1") { }
.buttonStyle(.bordered)
Button("Button 2", role: .destructive) { }
.buttonStyle(.bordered)
Button("Button 3") { }
.buttonStyle(.borderedProminent)
Button("Button 4", role: .destructive) { }
.buttonStyle(.borderedProminent)
}
.bordered๊ณผ.borderedProminent์ ๋จ๋ ์ผ๋ก ์ฌ์ฉํ๊ฑฐ๋ role๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ ๋ํ ๊ฐ๋ฅํ๋ค.
Apple์์๋ ๋์ ๋๋ฌด ์ ๋๋ ๋ฒํผ์ ๋๋ฌด ๋ง์ด ์ฌ์ฉํ์ง ๋ง ๊ฒ์ ๊ถ์ฅํ๋๋ฐ ์ด๋ ๋ชจ๋ ๊ฒ์ด ๋์ ๋๊ฒ ๋๋ฉด ์ค์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๊ธฐ์๋ ๋งค์ฐ ์ง์ ๋ถํด ๋ณด์ด๊ณ ์ ์ ์์ด ๋ณด์ด๊ธฐ ๋๋ฌธ์ธ ๊ฒ ๊ฐ๋ค.
์ด๋ฒ์๋ ์ด๋ฏธ์ง์ ๋ฒํผ์ ํตํฉํ์ฌ ์ฌ์ฉํด๋ณด๋ ์ฐจ๋ก์ด๋ค.
//1 ์ด๋ฏธ์ง๋ง ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
Button {
print("Edit button was tapped")
} label: {
Image(systemName: "pencil")
}
//2 ์ด๋ฏธ์ง์ ํ
์คํธ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
Button {
print("Edit button was tapped")
} label: {
Label("Edit", systemImage: "pencil")
}
์์ชฝ์ ์ด๋ฏธ์ง๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ง ๊ทธ๋๋ก ๋ฒํผ์ ์ด๋ฏธ์ง๊ฐ ์ถ๊ฐ๋จ์ผ๋ก์จ ์๋์ ๊ฐ์ด ๋ณผํ์ ์ด๋ฏธ์ง๊ฐ ํํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ค์์ผ๋ก ์ด๋ฏธ์ง์ ํ ์คํธ๋ฅผ Label์ ์ด์ฉํ์ฌ ํจ๊ป ์ถ๋ ฅํ๋ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด Label์ Edit์ด๋ผ๋ ํ ์คํธ๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ํ ์คํธ์ ์ด๋ฏธ์ง๊ฐ ํจ๊ป ํํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Alert messages(๊ฒฝ๊ณ ๋ฉ์์ง).
์ค์ํ ์ผ์ด ๋ฐ์ํ๋ฉด ์ฌ์ฉ์์๊ฒ ์๋ฆฌ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๋ชฉ, ๋ฉ์์ง, ํ์ํ ํญ๋ชฉ์ ๋ฐ๋ผ ํ๋ ๋๋ ๋ ๊ฐ์ ๋ฒํผ์ด ํฌํจ๋ ํ์ ์ฐฝ์ธ ๊ฒฝ๊ณ ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ธ์ ๊ฒฝ๊ณ ๋ฅผ ํ์ํด์ผ ํ๊ณ ์ด๋ป๊ฒ ํ์ํด์ผ ํ ๊น? view๋ ํ๋ก๊ทธ๋จ ์ํ์ ๊ธฐ๋ฅ์ด๋ฉฐ ๊ฒฝ๊ณ ์ ๊ฒฝ์ฐ์์๋ ์์ธ๋ ์๋๋ค. ๋ฐ๋ผ์ "๊ฒฝ๊ณ ํ์"๋ผ๊ณ ๋งํ๋ ๋์ ๊ฒฝ๊ณ ๋ฅผ ์์ฑํ๊ณ ํ์๋์ด์ผ ํ๋ ์กฐ๊ฑด์ ์ค์ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ๊ฒฝ๊ณ ํ์ ์ฌ๋ถ๋ฅผ ์ถ์ ํ๋ ์ผ๋ถ ์ํ๋ฅผ ๋ง๋ค ์ ์๋ค.
@State private var showingAlert = false
๊ทธ ์ดํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๊ฒฝ๊ณ ๋ฅผ ์ฒจ๋ถํ๊ณ ๊ฒฝ๊ณ ํ์ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ํด๋น ์ํ๋ฅผ ์ฌ์ฉํ๋๋ก ์ง์ํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ showingAlert๋ฅผ ํตํด ์ค์ ๋ก ๊ฒฝ๊ณ ๋ฅผ ํด์ผ ํ๋ ์๊ฐ์ ์ฆ์ ๊ฒฝ๊ณ ๋ฅผ ๋ณด์ฌ ์ค๋ค. ์๋๋ ์ด๋ฅผ ์ด์ฉํ ์์์ด๋ค.
struct ContentView: View {
@State private var showingAlert = false
var body: some View {
Button("Show Alert") {
showingAlert = true
}
.alert("Important message", isPresented: $showingAlert) {
Button("OK") { }
}
}
}
์ฝ๋๋ฅผ ์ดํดํ๊ธฐ์๋ ํฐ ์ด๋ ค์์ด ์์ ๊ฒ์ด๋ค. "show Alert"๋ผ๋ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์์ ์๋ ๊ฒฐ๊ณผ ํ๋ฉด์ฒ๋ผ ์ค์ํ ๋ฉ์์ง๋ผ๋ฉด์ ํ๋์ ๊ฒฝ๊ณ ์ฐฝ์ด ์ถ๋ ฅ๋๋ค.
.alert๋ฅผ ํตํด ์๋ฆผ์ ๋ฒํผ์ ์ถ๊ฐํ ์ ์๊ณ , ๊ฐ ๋ฒํผ์ด ํ๋ ์ผ์ ์ญํ ์ ๋ถ์ฌํ ์ ์๋ค.
.alert("Important message", isPresented: $showingAlert) {
Button("Delete", role: .destructive) { }
Button("Cancel", role: .cancel) { }
}
์์ชฝ ์ฝ๋์์๋ ๊ฒฝ๊ณ ์ฐฝ์์ ํ์ธํ ์์๋ ๋ฒํผ์ด 1๊ฐ ์์ง๋ง ์ด๋ฒ์๋ Delete, Cancel๋ก 2๊ฐ๊ฐ ๋จ๋๊ฒ์ ํ์ธ ํ ์ ์์ ๊ฒ์ด๋ค.
๋ง์ง๋ง์ผ๋ก ์๋์ ๊ฐ์ด ๋ ๋ฒ์งธ ํํ ํด๋ก์ ๊ฐ ์๋ Text์ ์ถ๊ฐ ์ ์ผ๋ก ๋ฉ์์ง ํ ์คํธ ๋ํ ๋ฐฐ์นํ ์ ์๋ค.
Button("Show Alert") {
showingAlert = true
}
.alert("Important message", isPresented: $showingAlert) {
Button("OK", role: .cancel) { }
} message: {
Text("Please read this.")
}
์ด๋ฒ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๊ฒ ๋ ๊ธฐ๋ณธ์ ์ธ ์์ ๋ค์ ํตํด VStack, Gradients, ๋ฒํผ๊ณผ ์ด๋ฏธ์ง, ๊ฒฝ๊ณ ์ฐฝ ์ถ๋ ฅ๊น์ง ๊ตฌ์ฒด์ ์ด์ง๋ ์์ง๋ง ์ ์ฒด์ ์ธ ๋๋๊ณผ ์ค์ต ์ ๋จผ์ ์์๋ณผ ์ ์์๋ค. ์ด์ ๋ฐ๋ก ์ค์ ํ๋ก์ ํธ๋ก ํ๋ฒ ๋ ๋ณต์ตํด๋ณด๋ฉด์ ๋ฐ๋ผ ๊ฐ๋ณด์!