SwiftUI & UIKit/Tutorials

HACKING WITH SWIFT - Guess the Flag

NelchuPapa 2022. 8. 31. 17:41
๋ฐ˜์‘ํ˜•

๐Ÿง‘‍๐Ÿ’ป์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” 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์— ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋”์šฑ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋งŽ๋‹ค.

  1. spacing์„ ์ด์šฉํ•˜์—ฌ ๊ฐ„๊ฒฉ์„ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ๋‹ค. 
  2. 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๊ฐ€ ์žˆ๋‹ค. ์ด๋Š” ์„ค๋ช…ํ•˜๊ธฐ ๋ชจํ˜ธํ•œ ์ ์ด ๋งŽ์œผ๋‹ˆ ๋ฐ”๋กœ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๋ฉด

 

  1. Color.primary : SwiftUI์˜ ๊ธฐ๋ณธ ํ…์ŠคํŠธ ์ƒ‰์ƒ์ด๋ฉฐ ์‚ฌ์šฉ์ž์˜ ์žฅ์น˜๊ฐ€ ๋ฐ์€ ๋ชจ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ์ง€ ์–ด๋‘์šด ๋ชจ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ์ง€์— ๋”ฐ๋ผ ๋ณ€ํ•˜๊ฒŒ ๋œ๋‹ค. 
  2. 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๊ฐ€์ง€๋กœ ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค. 

  1. ์„ ํ˜• ๊ทธ๋ ˆ๋””์–ธํŠธ
  2. ๋ฐฉ์‚ฌํ˜• ๊ทธ๋ ˆ๋””์–ธํŠธ
  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")
}

์œ„์ชฝ์˜ ์ด๋ฏธ์ง€๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ง ๊ทธ๋Œ€๋กœ ๋ฒ„ํŠผ์— ์ด๋ฏธ์ง€๊ฐ€ ์ถ”๊ฐ€๋จ์œผ๋กœ์จ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณผํŽœ์˜ ์ด๋ฏธ์ง€๊ฐ€ ํ‘œํ˜„๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

(1)

๋‹ค์Œ์œผ๋กœ ์ด๋ฏธ์ง€์™€ ํ…์ŠคํŠธ๋ฅผ Label์„ ์ด์šฉํ•˜์—ฌ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด Label์— Edit์ด๋ผ๋Š” ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ํ…์ŠคํŠธ์™€ ์ด๋ฏธ์ง€๊ฐ€ ํ•จ๊ป˜ ํ‘œํ˜„๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

(2)

 

 

 


 

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, ๋ฒ„ํŠผ๊ณผ ์ด๋ฏธ์ง€, ๊ฒฝ๊ณ ์ฐฝ ์ถœ๋ ฅ๊นŒ์ง€ ๊ตฌ์ฒด์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ์ „์ฒด์ ์ธ ๋А๋‚Œ๊ณผ ์‹ค์Šต ์ „ ๋จผ์ € ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด์ œ ๋ฐ”๋กœ ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋กœ ํ•œ๋ฒˆ ๋” ๋ณต์Šตํ•ด๋ณด๋ฉด์„œ ๋”ฐ๋ผ ๊ฐ€๋ณด์ž!

 

 

learning by repetition

๋ฐ˜์‘ํ˜•