์ „์ฒด ๊ธ€

UIKit์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋‹ค๊ฐ€ ํ˜„์žฌ๋Š” SwiftUI๋กœ ์„œ๋น„์Šค ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” Fram์ž…๋‹ˆ๋‹ค SwiftUI์™€ Combine์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋œ ๊ฒƒ๊ณผ ๊ธฐ์ˆ ์„ ๊ณต์œ ํ•˜๋Š” ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค. ์ฃผ์˜ : ์ ์—ˆ๋˜๊ฑฐ ๋˜ ์ ์„ ์ˆ˜ ์žˆ์Œ
Definition @resultBuilder struct ViewBuilder ํด๋กœ์ €์—์„œ ๋ทฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ๋ผ๋ฏธํ„ฐ ์†์„ฑ func contextMenu( @ViewBuilder menuItems: () -> MenuItems ) -> some View ํด๋กœ์ € ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด child view๋ฅผ ์ƒ์„ฑํ•˜๊ณ ์ž ํ•  ๋•Œ ViewBuilder๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„์™€ ๊ฐ™์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ViewBuilder๋ฅผ ์‚ฌ์šฉํ•ด ํด๋กœ์ €๋กœ child view๋ฅผ ํฌํ•จํ•˜๋Š” ๋ทฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. myView.contextMenu { Text("Cut") Text("Copy") Text("Paste") if isSymbol { Text("Jump to Definition") } } contextMenu์˜ menuItems ํด..
ํฐํŠธ๋Š” ํ”„๋ฆฌํ…๋‹ค๋“œ ์‚ฌ์šฉํ•จ (์‚ฌ์ดํŠธ๋งํฌ) Pretendard Pretendard ํ”„๋ฆฌํ…๋‹ค๋“œ Pretendard ํ”„๋ฆฌํ…๋‹ค๋“œ ๊ธ€๊ผด ๋‹ค์šด๋กœ๋“œ ์ผ๋ณธ์–ด ๋ฒ„์ „ ๋‹ค์šด๋กœ๋“œ GitHub์—์„œ ๋ณด๊ธฐ system-ui๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ธ€๊ผด Apple์˜ system-ui๊ฐ€ ์ต์ˆ™ํ•œ ๋‚˜๋กœ์„œ๋Š” San Francisco์™€ Apple SD ์‚ฐ๋Œ๊ณ ๋”• Neo๊ฐ€ ์—†๋Š” cactus.tistory.com ๊ธ€๊ผด ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ๋งฅ์— ์ €์žฅ ํ”ผ๊ทธ๋งˆ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ํ•ญ๋ชฉ์„ ๋”๋ธ” ํด๋ฆญํ•ด์„œ ์„ค์น˜ Figma ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ ํฐํŠธ, ํฐํŠธ์˜ ๊ตต๊ธฐ, ์ž๊ฐ„, ํ–‰๊ฐ„์„ ์ง€์ • ๊ทธ ํ›„ Text ์˜†์— ์  ๋„ค๊ฐœ ์•„์ด์ฝ˜ ํด๋ฆญ ํ…์ŠคํŠธ ์Šคํƒ€์ผ ๋ฉ”๋‰ด๊ฐ€ ๋‚˜์˜ค๋ฉด + ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ƒˆ๋กœ์šด ํ…์ŠคํŠธ ์Šคํƒ€์ผ์„ ๋“ฑ๋ก ์ƒˆ๋กœ์šด ํ…์ŠคํŠธ ์Šคํƒ€์ผ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ ๋’ค create style์„ ๋ˆŒ๋Ÿฌ ์ €์žฅ..
ํฐํŠธ ์ง€์ • .font(.system(.caption, design: .rounded)) ํฐํŠธ ๊ตต๊ธฐ ์ง€์ • .fontWeight(.medium) ํฐํŠธ ์ •๋ ฌ .multilineTextAlignment(.leading) ์ค„ ์ˆ˜ (UIKit๊ณผ ๋‹ฌ๋ฆฌ 0 ์œผ๋กœ ์ง€์ •ํ•  ๊ฒฝ์šฐ 1์ค„, nil๋กœ ์ง€์ •ํ•  ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ์ค„๋กœ ํ‘œ์‹œ๋จ. ๊ณต๊ฐ„์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธ€์ž ์งค๋ฆผ) .lineLimit(10) ์ค„๊ณผ ์ค„ ์‚ฌ์ด ๊ฐ„๊ฒฉ .lineSpacing(10) ๋ง ์ค„์ž„ํ‘œ ํ‘œ์‹œ ๋ถ€๋ถ„ ์ง€์ • (์ฒ˜์Œ, ์ค‘๊ฐ„, ๋) .truncationMode(.middle) ํฐํŠธ ์ƒ‰์ƒ ์ง€์ • .foregroundColor(.white) ๊ธ€์ž์™€ ๊ธ€์ž ์‚ฌ์ด ๊ฐ„๊ฒฉ .tracking(2) formatter ์ง€์ • Text(Date(), formatter: customFormat..
SwiftUI์—์„œ๋Š” UIKit์˜ UITextField ๋Œ€์‹ ์— TextField๋ผ๋Š” View๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. TextField๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ๊ธฐ์กด์— UITextFieldDelegate์˜ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ๋•Œ๊ฐ€ (์•„์ง๊นŒ์ง€๋Š”) ๋งŽ์Šต๋‹ˆ๋‹ค. SwiftUI์—์„œ UITextField๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ UIViewRepresentable๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด์š”. UIViewRepresentable์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์•„๋ž˜ ํฌ์ŠคํŒ… ์ฐธ์กฐ 2023.08.20 - [SwiftUI] - [SwiftUI] UIKit ์‚ฌ์šฉ์„ ์œ„ํ•œ UIViewRepresentable ์ดํ•ดํ•˜๊ธฐ [SwiftUI] UIKit ์‚ฌ์šฉ์„ ์œ„ํ•œ UIViewRepresentable ์ดํ•ดํ•˜๊ธฐ protocol UIViewRepresentable : View where S..
๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋‹ˆ ํฌ์ŠคํŒ…์— ์ฝ”๋“œ ๋ฐ•์Šค๊ฐ€ ํฌํ•จ๋ ๋•Œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ๋Š” html๊ณผ css๋ฅผ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์–ด ์›ํ•˜๋Š” ํฐํŠธ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ง‰์ƒ ์ฝ”๋“œ ๋ฐ•์Šค์— ๊ธ€๊ผด์€ ์ ์šฉ์ด ์•ˆ๋  ๋•Œ๊ฐ€ ์žˆ๊ณ , ์›ํ•˜๋Š” ํ•œ๊ธ€ ํฐํŠธ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์˜์–ด์˜ l, i, L, I ์˜ ๊ตฌ๋ถ„์ด ์–ด๋ ค์›Œ ์ฝ”๋”ฉ ๊ธ€๊ผด๋กœ ์ ์ ˆํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฝ”๋“œ ๋ฐ•์Šค์—๋งŒ ๋‹ค๋ฅธ ํฐํŠธ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํฌ์ŠคํŒ… ํ•ด๋ด…๋‹ˆ๋‹น ์šฐ์„ ์€ ๋ธ”๋กœ๊ทธ ์ „์ฒด ํฐํŠธ ๋ณ€๊ฒฝ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹น https://noonnu.cc/font_page/92 ๋ˆˆ๋ˆ„ D2Coding - ๋„ค์ด๋ฒ„ noonnu.cc ์ €๋Š” ๋ˆˆ๋ˆ„๋ผ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์ฃผ๋กœ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค! ๊ณต์‹์ ์œผ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์˜ˆ์œ ํฐํŠธ๊ฐ€ ๋งŽ์ด ์žˆ์–ด์š”! ๊ทธ๋ž˜๋„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๊ผญ ๋ผ์ด์„ผ์Šค ํ™•์ธํ•˜๊ธฐ!! ์›ํ•˜๋Š” ํฐํŠธ๋ฅผ ์„ ํƒํ•˜๋ฉด ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ..
Attributed ํ…์ŠคํŠธ๋‚˜ ๋ณ„๋‹ค๋ฅธ ์ฝ”๋“œ ์—†์ด ๋ฐ‘์ค„, ํ•˜์ดํผ๋งํฌ ์ด๋™์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. struct LinkView: View { var body: some View { Link("๋„ค์ด๋ฒ„๋กœ ์ด๋™", destination: URL(string: "https://naver.com")!) } } Link๋ผ๋Š” ๋ทฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ํ™”๋ฉด์— ๋ณด์ผ ํ…์ŠคํŠธ์™€ ์ด๋™ํ•  ์›น์‚ฌ์ดํŠธ ์ฃผ์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Link("๋„ค์ด๋ฒ„๋กœ ์ด๋™", destination: URL(string: "https://naver.com")!) .fontWeight(.heavy) .foregroundStyle(.green) ํฐํŠธ์˜ ๋ณ€๊ฒฝ๋„ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ด๊ฒƒ์ด ๋‹จ์ˆœ ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ํ•˜์ดํผ๋งํฌ ์ด๋™์ด๋ผ๋Š” ๊ฒƒ์„ ์ธ์ง€ ์‹œ์ผœ ์ฃผ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ..
bottom card view, botton sheet ๋“ฑ ์šฉ์–ด๊ฐ€ ๋งŽ์€๋ฐ modifier์˜ ์ด๋ฆ„์€ sheet์ž…๋‹ˆ๋‹ค @State private var isShowingSheet: Bool = false ํ™”๋ฉด์— sheet์œผ๋กœ ๋„์šธ view๋ฅผ ๋ณด์—ฌ์ค„์ง€ ์—ฌ๋ถ€๋ฅผ ์œ„ํ•ด State๋ฅผ ํ•˜๋‚˜ ์„ ์–ธํ•ด ์ค๋‹ˆ๋‹ค. false์ด๋ฉด ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š๊ฒŒ ๋˜๊ณ , true์ด๋ฉด ํ•˜๋‹จ์— sheet ํ˜•ํƒœ๋กœ view๊ฐ€ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Button { isShowingSheet.toggle() print(isShowingSheet) } label: { Text("๋ฐ”ํ…€์‹œํŠธ ๋„์šฐ๊ธฐ") } isShowingSheet ๊ฐ’์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•œ Button์„ ํ•˜๋‚˜ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด isShowingSheet ์„ ํ† ๊ธ€ํ•ด ์ค๋‹ˆ๋‹ค. .sheet(isPrese..
UIKit์—์„œ AVKit์˜ AVPlayer๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋™์˜์ƒ์„ ๋ณด์—ฌ ์ค„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. SwiftUI์—์„œ ๋™์˜์ƒ์„ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ณ  ์ปจํŠธ๋กค ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” UIViewControllerRepresentable์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. UIKit์˜ UIViewController๋ฅผ SwiftUI์˜ View๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด UIViewControllerRepresentable์„ ์ฑ„ํƒํ•˜๋Š” struct๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. View๊ฐ€ ํ™”๋ฉด์— ๋ณด์ด๋ฉด ์ž๋™์œผ๋กœ ๋™์˜์ƒ์ด ์‹คํ–‰๋˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. import SwiftUI import AVKit struct VideoPlayerView: UIViewControllerRepresentable { /// ์™ธ๋ถ€์—์„œ AVPlayer์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ @Bindin..
fram
FramiOS ๐Ÿฎ