๐ŸŽ Apple/SwiftUI

์นด์นด์˜ค์˜ ๋ธ”๋กœ๊ทธ ๊ฒ€์ƒ‰ API๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๊ฒฐ๊ณผ๊ฐ’์— HTMLํƒœ๊ทธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด ์ด๋ฅผ ์ง€์šฐ๊ณ  ์‹ถ์—ˆ๋‹ค! String์—์„œ "]+>|"" ์ด ์นœ๊ตฌ๋“ค์„ ์‚ญ์ œํ•ด์ฃผ๋ฉด ๋˜์—ˆ๋‹ค! ]+> ์ด ๋ถ€๋ถ„์ด html ํƒœ๊ทธ๋ฅผ ๊ฑฐ๋ฅด๋Š” ๋ถ€๋ถ„์ด๊ณ , " ์ด ๋ถ€๋ถ„์ด ์ •๊ทœํ‘œํ˜„์‹์„ ํ†ตํ•ด ๊ฑธ๋Ÿฌ์ง€์ง€ ์•Š๋Š” ๋ถ€๋ถ„์„ ๋˜ ํ•œ๋ฒˆ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๋ถ€๋ถ„์ด๋‹ค func stripHTMLTags(from htmlString: String) -> String { var string = htmlString.replacingOccurrences(of: "]+>|"", with: "", options: .regularExpression, range: nil) return string } ํด๋ž˜์Šค ๋‚ด์— ์ด๋ ‡๊ฒŒ ๋ฉ”์„œ๋“œ๋กœ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๊ณ , String์˜ Extension์œผ๋กœ ๊ตฌํ˜„ํ•ด๋„ ๋  ๋“ฏ..
ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ @Environment @Environment๋Š” SwiftUI์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ(wrapper)๋กœ, SwiftUI ๋ทฐ์˜ ์ปจํ…์ŠคํŠธ(Context)์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. @Environment๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ทฐ์—์„œ ์‹œ์Šคํ…œ์˜ ์„ค์ •์ด๋‚˜ ์ƒํƒœ์™€ ๊ฐ™์€ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•œ ์ •๋ณด์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ทฐ๊ฐ€ ๋‹คํฌ ๋ชจ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ์ž์˜ ๋กœ์ผ€์ผ์— ๋งž๊ฒŒ ํ…์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜, ์‹œ์Šคํ…œ์˜ ์•ก์„ธ์Šค ๊ถŒํ•œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. @Environment๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ @State, @Binding, @ObservedObject ๋ฐ @EnvironmentObject์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋ชจ๋‘..
ViewBuilder๋ž€? ํด๋กœ์ €์—์„œ ๋ทฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ปค์Šคํ„ด ๋งค๊ฐœ๋ณ€์ˆ˜ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ViewBuilder๋Š” ์ž์‹ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํด๋กœ์ € ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์†์„ฑ์œผ๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ทฐ ๋นŒ๋”๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ํด๋กœ์ €๊ฐ€ ์—ฌ๋Ÿฌ ์ž์‹ ๋ทฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, SwiftUI์—์„œ๋Š” ViewBuilder๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋กœ์ € ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐœ๋…์„ ํ™•์žฅํ•˜์—ฌ, ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ๋งŒ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์†์„ฑ์„ ๋งŒ๋“ค์–ด ํด๋กœ์ €์—์„œ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ ๋†’๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์žฌ์‚ฌ์šฉ์„ฑ๋„ ๋†’์•„์ง‘๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ์ง€์ • ๋งค๊ฐœ๋ณ€์ˆ˜ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ์˜ ์ƒ‰์ƒ, ํ…Œ๋‘๋ฆฌ ์Šคํƒ€์ผ, ๋ฐฐ์น˜ ๋ฐฉ์‹ ๋“ฑ์„ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ• ..
Button { } label: { Text("Next") .frame(width: 200.0, height: 100.0) .foregroundColor(.blue) .font(.system(size: 14, weight: .bold)) .overlay( RoundedRectangle(cornerRadius: 20) .stroke(.black, lineWidth: 5) ) } .background(.pink) .cornerRadius(20) //์œ„์˜ cornerRadius๊ฐ’๊ณผ ์ผ์น˜์‹œํ‚ค๊ธฐ ์•„์ง ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ๋ถ€์ž์—ฐ์Šค๋Ÿฝ๋‹ค!?
NavigationView์—์„œ iPad sidebar ์ˆจ๊ธฐ๋Š” ๋ฐฉ๋ฒ• .navigationViewStyle(StackNavigationViewStyle())
๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ์ค‘๋ณต๋˜์–ด ๊ณ„์† ์Œ“์ผ๋• NavigationView๋Š” ๋ฉ”์ธ ๋ทฐ์—๋งŒ ์„ค์ •ํ•˜๊ณ  NavigationLink๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ํ•˜์œ„๋ทฐ์—๋Š” NavigationView{}๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
1. ๋‚ด๋น„๊ฒŒ์ด์…˜ ํƒ€์ดํ‹€์ด ์ค‘์ฒฉ๋˜๋Š” ๋ฌธ์ œ >> ๊ฐ€์žฅ ์ฒ˜์Œ ๋ทฐ์—๋งŒ NavigationView๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. ๊ทธ ๋‹ค์Œ์— ์Œ“์ด๋Š” ๋ทฐ์—๋Š” ๋„ฃ์–ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. 2.navigationBarTitleDisplayMode ๊ฐ€ ์›ํ•˜๋Š”๋ฐ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ >> Link๋กœ ์—ฐ๊ฒฐ๋œ ์ด์ „ ๋ทฐ์—(ํ•ด๋‹น ๋ทฐ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ทฐ์—) navigationBarTitleDisplayMode(.large) ํ•ด์ฃผ์—ˆ๋‹ค.
1. ๋ทฐ ์ „์ฒด ๋ฐฐ๊ฒฝ ์ƒ‰ ๋ฐ”๊พธ๊ธฐ (๋…ธ์น˜ ํฌํ•จ) ZStack { Color.green.edgesIgnoringSafeArea(.all) } ZStack ์•ˆ์— Color.green.edgesIgnoringSafeArea(.all) ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค. >> NavigationView๋ฅผ ์‚ฌ์šฉํ•  ๋• ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ NavigationView ์•ˆ์— ZStack์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. struct HomeView: View { var body: some View { NavigationView { ZStack { Color.red.edgesIgnoringSafeArea(.all) } } } } 2. ์ปจํŠธ๋กค ์š”์†Œ ๋ฐฐ๊ฒฝ ์ƒ‰ ๋ฐ”๊พธ๊ธฐ .background(.yellow) ์›ํ•˜๋Š” ์š”์†Œ {ํ…์ŠคํŠธ, ๋ฒ„ํŠผ, ๋ทฐ ๋“ฑ } ๋’ค์— .backgro..
JINiOS
'๐ŸŽ Apple/SwiftUI' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก