
๐ Live Activity ์ข ๋ฃ '์ฌ๋ผ์' ์ฑ ๊ฐ๋ฐ์ ํ ๋, LiveActivity ๊ตฌํ์ ๋ด๋นํ์๋๋ฐ ๋น์์ ๊ฒช์๋ ์ด์์ ๊ด๋ จํ์ฌ ๋ ธ์ ์ ๊ธฐ๋กํด๋์๋๊ฒ์ ํฐ์คํ ๋ฆฌ์๋ ์ฎ๊ฒจ์ ์ด๋ณด๊ณ ์ ํ๋ค. ์ดํ ์ธ๋งํฌ์ด์ ๋ํ ํฌ์คํ ์ ํ ๊ฑด๋ฐ, ์ธ๋งํฌ์ด์ ๊ด๋ จํ ์ด์์ด๊ณ , ๋ค์๊ณผ ๊ฐ๋ค. ๐ฌ Background ์ํ์์ ์ฑ ๊ฐ์ ์ข ๋ฃ์ LiveActivity๋ ์ข ๋ฃํ๊ฒ ํ๋ ค๋ฉด ? ์ฆ, DynamicIsland(LiveActivity)๊ฐ ๋์์ค์ ์ฑ์ ์ค์์ดํํ์ฌ ๊ฐ์ ์ข ๋ฃํ๋ฉด LiveActivity๋ ์ข ๋ฃ๋์ง ์๊ณ ๋ทฐ๊ฐ ๊ทธ๋๋ก ๋จ์์๋ ๊ฒ์ด๋ค. ํ์ง๋ง ๊ธฐ๋ฅ์์ฒด๋ ์ข ๋ฃ๋๋ค.์์ฝํ๋ฉด, ์์ฒ๋ผ ์ฑ์ ์ข ๋ฃ์ํด์ผ๋ก์จ ํจ์๋ ๋์ํ์ง ์๊ธฐ์ ๊ธฐ๋ฅ์ ๋ฉ์ถ์ง๋ง, LiveActivity ๋ํ ์ข ๋ฃ๊ฐ ๋์ด์ผํ๋๋ฐ ์ฑ์ด ๊ฐ์ ์ข ๋ฃ..

๐ Custom Font ์ถ๊ฐ ๊ธฐ์กด์ Xcode์ ์ปค์คํ ํฐํธ๋ฅผ ์ถ๊ฐํ ๋,์ด๋ ๊ฒ ํฐํธํ์ผ๋ค์ ๋๋๊ทธํ์ฌ ์ถ๊ฐํ๊ณ , info์์ ํฐํธ๋ค์ Target ์ค์ ํ์ฌ ์ฌ์ฉํ๋จ๋ง์ด์์? ๋ง์ง๋ง์ผ๋ก, Font Extension ํ์ผ์ ์์ฑํ์๊ณ ์ !extension Font { // Bold static let pretendardBold28: Font = .custom("Pretendard-Bold", size: 16) static let pretendardBold24: Font = .custom("Pretendard-Bold", size: 20) // SemiBold static let pretendardSemiBold16: Font = .custom("Pretend..
๐ Tabbar Hide ๐ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ Tabbar๊ฐ ์์๋๋ฐ ๋ฉ์ธ ํญ๋ฐ ํ๋ฉด์์ ๋ค๋น๊ฒ์ด์ ์ผ๋ก View๋ฅผ ์ด๋ํ๋ฉด์ด๋๋ View๋ถํฐ๋ Tabbar๊ฐ ์๋์ค๊ฒ ํด์ผํ์ต๋๋ค. ์ ๋ง ๊ฐ๋จํ ํด๊ฒฐ๋๋๊ตฐ์ ? ๐A View๊ฐ Tabbar์ ๋ฉ์ธ๋ทฐ์ด๊ณ ,A View์์ Navigation์ ํตํด B View๋ก ์ง์ ํ์๋, B View์์ ํญ๋ฐ๋ ์ฌ๋ผ์ง๊ฒ ํ๊ณ ์ถ๋ค. ํ๋ค๋ฉด B ํ์ผ์ View ์ฝ๋์ .toolbar(.hidden, for: .tabBar) ์ด ๋ชจ๋ํ์ด์ด๋ฅผ ์ ์ฉํด์ฃผ๋ฉด ๋ฉ๋๋ค ! ๋ฑ ๋ด๋ tabbar๋ฅผ hiddenํด์ฃผ๋๊ฑฐ๊ฒ ์ฃ ? โ๊ทผ๋ฐ ๋ฌธ์ ๊ฐ ๋ญ์๋ .. โ A ์์ B๋ก ๊ฐ๋ ํญ๋ฐ๋ ์์ฐ์ค๋ฝ๊ฒ ์ฌ๋ผ์ก์ง๋ง, B์์ ๋ค์ A๋ทฐ๋ก ๋๊ฐ๋ Tabbar๊ฐ ๋ฐ๋ก ๋ ์์ด์ผํ๋๋ฐ๋๋ ์ด๊ฐ ์์ด ..

๐ ์ธ์ฑ๋ฆฌ๋ทฐ(In-App Review) ์ด๋ฒ์ ํํ๋ก์ ํธ์ ๊ฐ๋ฐ์์์ด ์กฐ๊ธ์ฉ ๊ณ์ ๋ฏธ๋ค์ง๋ฉด์, ๊ฐ๋ฐํ๊ณ ์ถ์๋ฐ ํ์ง๋ชปํด์ ์ต๊ทผ์ ์กฐ๊ธ์ฉ ์ ๋ฐ์ดํธํ๊ณ ์๋ ๊ฐ์ธํ๋ก์ ํธ ์ฑ์ ์ธ์ฑ๋ฆฌ๋ทฐ๋ฅผ ๋ฃ์ด๋ณด์์ต๋๋ค. ์ธ์ฑ๋ฆฌ๋ทฐ๋ ์ฑ ๋ด์์ ์ฑ์ ์ฑ์คํ ์ด ํ์ ๊ณผ ๋ฆฌ๋ทฐ๋ฅผ ๋จ๊ธธ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.์ฌ์ค ์ ๊ฐ ์ด๊ฑธ ์ ์ฉํ๋ ค๋ ์ฑ์ด ์ฌ์ฉ์๊ฐ ๋ง์ง ์์ง๋ง ๊พธ์คํ ์ฌ์ฉํ๊ณ ์๋ ์ฌ๋์ด ์์ต๋๋ค. ๊ทผ๋ฐ ํ์ฅ์ฑ์ด ๋์ง ์์ ๋จ์ผ ๊ธฐ๋ฅ ์ฑ์ด๋ผ.. ํ์ฅ์ ํ๋ค๋ฉด ์์ฒญ ํฌ๊ฒ ํด์ผํด์ ์ฌ์ฉ์๊ฐ ์๊ฒฌ์ด๋ ํผ๋๋ฐฑ์ ์กฐ๊ธ ๋ ๋ค์ด๋ณด๊ณ ์ถ์ด์ ์ ์ฉํ๋ คํฉ๋๋ค. ์ ๊ฐ SwiftUI๋ฅผ ์ฒ์ ๊ณต๋ถํ ๋, ์ ๊ฐ ์ฌ์ฉํ๋ ค๊ณ ๊ฐ๋จํ๊ฒ ๋ง๋ค์๋ ์ฑ์ธ๋ฐ ๋ฐฉ์นํด๋๋ค๊ฐ ๋์ค์ ๋ณด๋๊น ๊ณ์ ์ฐ๊ณ ์๋ ์ฌ๋์ด ์๋๋ผ๊ตฌ์?์ต๊ทผ์ ์ด๊ฒ์ ๊ฒ ์กฐ๊ธ์ฉ ์ ๋ฐ์ดํธ ์ค์ ๋๋ค ! Stor..

TextEditor์ Background Color๋ฅผ ์ ์ฉํ๋ ค๋ฉด .scrollContentBackground(.hidden)์ผ๋ก ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ์ ์จ๊ธฐ๊ณ .background(.clear)๋ฅผ ์ ์ฉํ๋ฉด ๋๋ค. ์ด ์ํ์์, TextEditor(text: $memoContent) //.scrollContentBackground(.hidden) .background(.red) .padding() .background(.red) .cornerRadius(10) .lineSpacing(10) ์ฃผ์์ ์ง์์ฃผ๋ฉด, TextEditor(text: $memoContent) .scrollContentBackground(.hidden) .background(.red) .padding() .background(.red) .corne..

๐ @State @Binding Property Wrapper์ ๋ํด์ State โ PropertyWrapper ? ๋ณํ๊ฐ ์๊ธฐ๋ฉด ํด๋น ๋ณ์์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์๋ก ์ธ ์ ์์์ ์๋ฏธํ๋ค. SwiftUI์์๋ property wrapper๋ฅผ ์ฌ์ฉํด์ ๋ณ์์ ๋ณํ์ ํด๋น ์์ ์ ์๋ํ ํ ์ ์๋ค. SwiftUI๋ state๋ก ์ ์ธ๋ ํ๋กํผํฐ๋ค์ ์ ์ฅ์๋ฅผ ๊ด๋ฆฌํ๋ค. StateValue ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ทฐ๋ ํด๋น value์ appearance๋ฅผ ๋ฌดํจํํ๊ณ ๋ค์ ๊ฐ์ ๊ณ์ฐํ๋ค. State ๋ณ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด View๋ ์๋ก ๋๋๋ง์ ํ์ฌ ํญ์ ์ต์ ๊ฐ์ ๊ฐ์ง๋ค. State ์ธ์คํด์ค๋ ๊ทธ ์์ฒด๋ก ๊ฐ์ด ์๋, ๊ฐ์ ์ฝ๊ณ ์ฐ๋ ๊ฒ์ ๋งํ๋ค. ํ์ฌ ๋ทฐ UI์ ํน์ ์ํ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ง๋ค์ด์ง๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณดํต Priv..

๐ Save Color in UserDefaults from Color Picker variable in Color Data private let COLOR_KEY = "COLOR" private let userDefaults = UserDefaults.standard saveColor func saveColor(color: Color) { let color = UIColor(color).cgColor if let components = color.components { userDefaults.set(components, forKey: COLOR_KEY) } } loadColor func loadColor() -> Color { guard let colorComponenets = userDefaults...

๐ ์ด๊ธฐํ์ ๋ํด์ AppDelegate() init() AppDelegate๋ฅผ ์ด์ฉํ ์ด๊ธฐํ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ค AppDelegate์ ์ญํ (์ง์ ์ )์ ํ๋ ๊ฒ์ด ๋ฐ๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ถ์ฅ๋์ง๋ ์๋ ๋ฐฉ๋ฒ์ด๋ค. @main struct PushMessageApp: App { var body: some Scene { WindowGroup { ContentView() } } } ์ ์ฝ๋์์ ๋ณด์ด๋ App ํ๋กํ ์ฝ ์์ฒด๊ฐ ์ฑ์ ๊ตฌ์ฑ์ ๋ด๋นํ๋ ๊ตฌ์กฐ์ฒด์ ํ๋กํ ์ฝ์ ์ง์ ํด์ฃผ์ด์ ์ฑ์ ์์(Presenting) ์ง์ ์ ์ ํด์ฃผ๋ ์ญํ ์ ํ๊ฒ ๋๋ค. ๋ํ @main์ ํตํ์ฌ ์ฑ์ด ์์๋๊ณ ๊ฐ์ฅ ๋จผ์ ๋ค์ด๊ฐ์ผํ๋ ๋ถ๋ถ์ ๋ช ์ํด์ฃผ๊ณ ์๊ธฐ ๋๋ฌธ์ AppDelegate๊ฐ ํ์ํ์ง ์๋ค. ๊ทธ๋ฌ๋ ์ฑ์ ์ด๊ธฐํ ์ด์ธ์๋ AppDele..