iOS ๐ŸŽ/SwiftUI

NavigationStack๊ณผ NavigationSplitView์—์„œ ๋ทฐ ์ด๋™์„ ์œ„ํ•ด NavigationLink๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. struct Fruit: Identifiable, Hashable { var id = UUID() let name: String let emoji: String func hash(into hasher: inout Hasher) { hasher.combine(name) } } ๋ฆฌ์ŠคํŠธ์— ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์ •์˜ struct FruitDetailView: View { let fruit: Fruit var body: some View { VStack { Text(fruit.emoji) .font(.largeTitle) Text(fruit.name) } } } ๋ฐ์ดํ„ฐ ..
.overlay( Rectangle() .stroke(PWColor.gray100, lineWidth: 1) ) // .border(PWColor.gray100, width: 1) ์•„๋ž˜border์„ ์‚ฌ์šฉํ•˜๋ฉด frame์œผ๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋จ. ํ•ด๋‹น ์˜์—ญ ๊นŒ์ง€ ์žกํ˜€์„œ VStack์œผ๋กœ ์Œ“์œผ๋ฉด ์ค‘๊ฐ„์€ 2๊ฐ€ ๋จ
์•„๋ฌด๋ฆฌ ๋ด๋„ ํƒญ ๋ฐ”๊ฐ€ ๋งž๋Š”๊ฑฐ ๊ฐ™์€๋ฐ ๋””์ž์ธํŒ€์ด ํ† ๊ธ€์ด๋ผ ํ•˜๋‹ˆ ์šฐ์„  ํ† ๊ธ€์ธ๊ฑธ๋กœ..!! ๋ญ 2๊ฐœ๋ฉด ํ† ๊ธ€ ๋งž์ง€! ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ๋ช‡ ๊ฐœ๊ฐ€ ์˜ฌ์ง€ ๋ชจ๋ฅด๊ณ , ํ•ด๋‹น ์˜์—ญ์„ ํƒญํ–ˆ์„ ๋•Œ ํ† ๊ธ€ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์‹คํ–‰๋˜์•ผ ํ•œ๋‹ค. Namespace๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  animation ์„ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค! ์ฒ˜์Œ์— GeometryReader๋กœ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐ ํ•œ ๋’ค ํ•˜๋‚˜์˜ View์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•ด ์ฃผ์—ˆ๋”๋‹ˆ offset๊ณผ padding ์œผ๋กœ ๋ทฐ ๊ณ„์ธต์„ ๋ฐ”๊ฟจ์„ ๋•Œ ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ๋‹ค. GeometryReader๋กœ ๊ณ„์‚ฐ ํ•œ ์œ„์น˜๊ฐ€ ๋‹ฌ๋ผ์ ธ์„œ ์—‰๋šฑํ•œ ๊ณณ์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ์›€์ง์˜€๋‹ค. struct CustomToggle: View { let priceList = ["on", "off", "test"] /// ํ† ๊ธ€ ..
struct TipBubbleShape: Shape, InsettableShape { private var insetValue = 0.0 func inset(by amount: CGFloat) -> some InsettableShape { var bubble = self bubble.insetValue = amount return bubble } func path(in rect: CGRect) -> Path { let width = rect.width let height = rect.height let radius = rect.height / 2.0 let midpoint = radius * 0.42 let path = Path { p in p.move(to: CGPoint(x: 25, y: height..
2023.10 ๊ธฐ์ค€ SwiftUI์—์„œ life cycle updates modifier๋กœ ์ง€์ •๋œ ๊ฒƒ์€ 4๊ฐœ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋งˆ์ง€๋ง‰ task๋Š” task๋งŒ ๋”ฐ๋กœ ํ•œ๋ฒˆ ํŒŒ๋ณด๊ธฐ๋กœ ํ•˜๊ณ  onAppear, onDisappear, task ์•Œ์•„๋ด…์‹œ๋‹ค ๋‹ค ๋“œ๋ฃจ์™€~ SwiftUI์—์„œ ํ™”๋ฉด์„ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. UIKit์—์„œ ViewController๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋Š” ํ™”๋ฉด ์ „ํ™˜๋˜๋Š” View๋ฅผ ViewController๋กœ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์œ„๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ SwiftUI ์—์„œ๋Š” view๋ผ๋Š” ๋‹จ์œ„๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๊ธฐ ๋ณด๋‹ค๋Š” View๊ฐ€ View๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ View์˜ ์ผ๋ถ€๋ถ„์ด ๋  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๊ณ ๋ คํ•ด์„œ ์•Œ์•„๋ด์•ผ ํ•œ๋‹ค. ์šฐ์„  ๊ฐ modifire์„ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๋ฉด onAppear func o..
๋ฆฌ์ŠคํŠธ๋Š” ์„œ๋น„์Šค ๋˜๊ณ  ์žˆ๋Š” ์•ฑ์—์„œ ๋น ์ง€์ง€ ์•Š๊ณ  ๋“ฑ์žฅํ•˜๋Š” UI ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ผ๋ถ€๋งŒ ๊ฐ€์ ธ์˜จ ๋’ค ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ์ผ๋ถ€๋ฅผ ๋‹ค ๋ณด๋ฉด ์ƒˆ๋กœ์šด ๋ชฉ๋ก์„ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๋ฐฉ์‹์ด ์žˆ๋Š”๋ฐ ์ด๋ฅผ load more ํ˜น์€ infinite scroll ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. SwiftUI์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ View๋“ค์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘์— VStack์€ ์•„์ดํ…œ๋“ค์„ ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ์Œ“์Šต๋‹ˆ๋‹ค. ์ด VStack์ด ScrollView์™€ ๋งŒ๋‚˜๋ฉด ์ €ํฌ๊ฐ€ UIKit์—์„œ ๋ณด์•˜๋˜ UITableView ํ˜น์€ UICollectionView์™€ ๋™์ผํ•œ UI๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์— LazyVStack์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค! ๊ฐ์ž ์–ด๋””์— ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์„๊นŒ์š”? ์ฐจ์ด์ ๊ณผ ๊ฐ๊ฐ ๋™์ž‘ํ•˜๋Š” ..
๋„ค๋น„๊ฒŒ์ด์…˜์€ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฐ๊ณผ ๋ทฐ ์‚ฌ์ด๋ฅผ ์ด๋™ํ•˜๊ณ  ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ UINavigationController์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ navigationStack์„ ๊ด€๋ฆฌํ•˜๋ฉฐ NavigationBar ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํ™”๋ฉด๊ฐ„ ์ด๋™์„ ์ง€์› NavigationView๋Š” iOS ๊ธฐ์ค€ 13.0 ~ 17.0 ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋ฉฐ deprecated ์˜ˆ์ •์ด๊ธฐ ๋•Œ๋ฌธ์— iOS 16.0 ๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋ฉด NavigationStack์„ ์‚ฌ์šฉ NavigationLink NavigationStack, NavigationSplitView ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ NavigationView์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ struct NavigationLink where Label : View, Destination : View label์€ ํ˜„์žฌ ํ™”๋ฉด์— ๋ณด์ด๋Š” ๋ทฐ๋กœ์„œ Navi..
๋™์ผํ•œ UI ๊ตฌ์„ฑ์„ ๊ฐ€์ง€์ง€๋งŒ ๊ฐ€๋กœ๋ชจ๋“œ์—์„œ ์„ธ๋กœ๋ชจ๋“œ๋กœ ๋ณ€๊ฒฝ๋ ๋•Œ ํ™”๋ฉด์˜ ๋„“์ด๊ฐ€ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํŠน์ • UI์—์„œ๋Š” ํ™”๋ฉด์ด ๊นจ์งˆ ์ˆ˜ ์žˆ์–ด์„œ ์ด์— ๋Œ€์‘ํ•ด์•ผ ํ•ด์š”. ViewBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ๋Œ€์‘ ๊ฐ€๋Šฅํ•œ View๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ํ˜น์‹œ ViewBuilder๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜์„ธ์š”! [SwiftUI] ViewBuilder ์•Œ์•„๋ณด๊ธฐ Definition @resultBuilder struct ViewBuilder ํด๋กœ์ €์—์„œ ๋ทฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ํŒŒ๋ผ๋ฏธํ„ฐ ์†์„ฑ func contextMenu( @ViewBuilder menuItems: () -> MenuItems ) -> some View ํด๋กœ์ € ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด child view๋ฅผ ์ƒ์„ฑํ•˜๊ณ ์ž framios.tis..
fram
'iOS ๐ŸŽ/SwiftUI' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก