Skip to content

iOS troubleShooting Week 1

dochoi edited this page Dec 20, 2020 · 8 revisions

์ด๋ฒคํŠธ ๊ตฌํ˜„๊ณผ ๋ฐฉ์ถœ ๋ฐฉ๋ฒ•

๋จผ์ € ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์˜ ๋™์ž‘์ด ์–ด๋Š ๋ทฐ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ง€ ์•Œ ํ•„์š”๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์žฌ์‚ฌ์šฉ์ด ๋งŽ์ด ์ด๋ฃจ์–ด์ง€๋Š” SwiftUI์˜ ํŠน์„ฑ์ƒ ์ฒ˜์Œ์—” ๊ฐ๊ฐ์˜ ๋ชจ๋“  ๋ทฐ์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ• ๊นŒ ๊ณ ๋ฏผํ–ˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ณ  ์ž์‹ ์˜ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณ„์‚ฐ ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ตฌํ˜„ํ•ด ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๋ทฐ๋ฅผ ํŠน์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค

๊ทธ๋Ÿฌ๋‚˜ ์žฌ์‚ฌ์šฉ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๋ทฐ์—์„œ๋Š” ์–ด๋Š ๋ทฐ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์žฌ์‚ฌ์šฉ์ด ๋˜๋Š” ๋ทฐ์˜ ๊ฒฝ์šฐ์—” ๊ฐ๊ฐ์˜ id๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ๋ถ„์„ํ•  ๋•Œ ๊ตฌ๋ถ„๋˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ทฐ์˜ ๋„ค์ด๋ฐ์— ์ข€ ๋” ์‹ ๊ฒฝ์„ ์“ฐ๊ฒŒ ๋˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

extension View {
    static var name: String {
        String(describing: Self.self)
    }
}

์ด๋ฒคํŠธ ๋ฐœ์ƒ ๋ฐฉ๋ฒ•

์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ๋งŽ์ด ๊ณ ๋ฏผํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—” Button์˜ ์•ก์…˜๋งˆ๋‹ค ์‹คํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ฃผ๋ ค๋Š” ์ƒ๊ฐ์ด์—ˆ๋Š”๋ฐ ๊ฐ€๋…์„ฑ๋„ ์•ˆ ์ข‹์•„์งˆ ๋ฟ๋”๋Ÿฌ ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ๋ฒ„ํŠผ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ทฐ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ๋„ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ์กด์˜ ๋™์ž‘์— ์ถ”๊ฐ€๋กœ ์ œ์Šค์ฒ˜๋ฅผ ๋”ํ•  ์ˆ˜ ์žˆ๋Š” simultaneousGesture๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ์˜ ๊ธฐ์กด ๋™์ž‘์„ ์œ ์ง€ํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ๋™์ž‘์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

extension View {
    public func emitEventIfTapped(event: Event) -> some View {
        return self.simultaneousGesture(
            TapGesture()
                .onEnded { _ in
                    EventSendManager.shared.eventHandler(event)
                })
    }
}

๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ์™ธ์ ์œผ๋กœ ํƒญ๋ทฐ์˜ ๊ฒฝ์šฐ ๊ฐ ํƒญ๋ฒ„ํŠผ์— ๋Œ€ํ•ด ๋‘ ๊ฐ€์ง€ ๋™์ž‘์ด ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š์•„์„œ , ๊ฐ๊ฐ์˜ ๋ทฐ์— tag๋ฅผ ์ง€์ •ํ•ด TabiView์˜ selection ์†์„ฑ์ด ๋ฐ”๋€” ๋•Œ didSet์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ธฐ๊ธฐ ๊ฐ„ ํŒŒํŽธํ™” ๋ฌธ์ œ

๊ธฐ๋ณธ์ ์œผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ iPhone 11 pro๋ฅผ ํ‘œ์ค€์œผ๋กœ ์žก๊ณ  UI ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ ๋™์•ˆ ์‚ฌ์šฉํ•˜๋˜ ์‹ค๊ธฐ๊ธฐ๋Š” iPhone SE์˜€๋Š”๋ฐ ๊ทน๋‹จ์ ์œผ๋กœ ์ฐจ์ด๊ฐ€ ์žˆ์–ด์„œ UIScreen.main.bound๋ฅผ ์ด์šฉํ•˜์—ฌ ์ตœ๋Œ€ํ•œ ๊ธฐ๊ธฐ ๊ฐ„ ๋™์ผํ•œ ํ™”๋ฉด์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. GeometryReader ๋˜ํ•œ ๊ณ ๋ คํ•ด ๋ดค์œผ๋‚˜ ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ตœํ•˜์œ„ ๋ทฐ๊นŒ์ง€ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์ด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ ธ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ํ™”๋ฉด ํšŒ์ „ ์‹œ์— orientation์„ ๊ฐ์ง€ํ•˜์—ฌ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋˜ ๋„์ค‘ UIScreen.main.bound๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๊ณ  GeometryReader๊ฐ€ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์—ฌ์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

TabView ๋ฒ„๊ทธ

ezgif-3-240d1a4465c4

์•ฑ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์Šคํฌ๋กค ๋ทฐ์˜ ํŽ˜์ด์ง•์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด UIScroll์˜ ์†์„ฑ์„ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•˜์˜€์œผ๋‚˜, ์•ฑ ์ „์ฒด์˜ ์Šคํฌ๋กค ๋ทฐ๊ฐ€ ํŽ˜์ด์ง•์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๊ณ , ๊ฒฐ๊ตญ ๊ธฐ๋ณธ์ ์ธ ์•จ๋ฒ”์ด๋‚˜ ๋…ธ๋ž˜ ๋“ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์Šคํฌ๋กค์€ ์—ฐ์† ์Šคํฌ๋กค ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ ์ค‘ ๋ณด๊ด€ํ•จ ํƒญ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์ˆ˜์ ์œผ๋กœ ํŽ˜์ด์ง•์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์•Œ์•„๋ณด๋˜ ์ค‘ SwiftUI2.0์—์„œ ์ง€์›ํ•˜๋Š” PageTabViewStyle์ด ์žˆ์–ด ์ ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ž˜ ๋˜๋Š” ๋“ฏ ํ–ˆ์œผ๋‚˜ ํƒญ๋ทฐ ๋‚ด์—์„œ ์Šคํฌ๋กค๊ณผ LazyVgrid ๋“ฑ ๋ณต์žกํ•œ ๋ทฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ํƒญ์ด ๋„˜์–ด๊ฐ€์ง€์ง€ ์•Š๊ณ  ํ™”๋ฉด ๊ตฌ์„ฑ์ด ๋ฌด๋„ˆ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๋ณต์žกํ–ˆ๋˜ ๋ทฐ์˜ ์Šคํฌ๋กค ๊ณ„์ธต์„ ์ค„์ด๊ณ  ๊ผญ ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด ์•„๋‹ˆ๋ฉด Lazy๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ VStack์„์‚ฌ์šฉํ•˜๋‹ˆ ๋ฒ„๊ทธ๊ฐ€ ์—†์–ด์ง€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”์–ด๋ฐ์ดํ„ฐ ์‚ฌ์ „ํ˜• ์ €์žฅ, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฌธ์ œ

์ด๋ฒคํŠธ ์ €์žฅ ๋ฐฉ์‹์„ ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ฐ ์ด๋ฒคํŠธ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ์„œ [String: Stting] ๋”•์…”๋„ˆ๋ฆฌ ํ˜•์‹์„ ์ฑ„ํƒํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ์ฝ”์–ด๋ฐ์ดํ„ฐ์— ์ €์žฅํ•˜๋Š” ๊ณผ์ •์ด ์กฐ๊ธˆ ๊นŒ๋‹ค๋กœ์› ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” Transformable ํƒ€์ž…์„ ์ด์šฉํ•ด Set์œผ๋กœ ์ €์žฅํ•˜๋ ค ํ–ˆ์œผ๋‚˜, 1:๋‹ค ๊ด€๊ณ„๋กœ ์ €์žฅํ•˜๋‹ˆ ์กฐ๊ธˆ ๋” ์ˆ˜์›”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐ์— persistenceController ๋‚ด์˜ ํ•จ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ•œ ์ œ๋„ค๋ฆญํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ €์žฅํ•  ํƒ€์ž…์„ ์™ธ๋ถ€์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์œผ๋‚˜, ํ‚ค๊ฐ’์„ ๋”ฐ๋กœ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ํŠน์„ฑ์ƒ ๋‚ด๋ถ€์—์„œ ๊ตฌ์ฒด ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๋ญ”๊ฐ€ ๋ฐฉ๋ฒ•์ด ์กฐ๊ธˆ ๋” ์žˆ์„๊ฒƒ ๊ฐ™์•„ ์กฐ๊ธˆ ์•„์‰ฌ์› ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ์ ์„ Dateํ˜•์œผ๋กœ ์ €์žฅํ•ด ์™”์—ˆ๋Š”๋ฐ, ๊ฐœ๋ฐœ ์ค‘ ์„œ๋ฒ„ ์ชฝ์—์„œ ์ด๋ฒคํŠธ ์‹œ์ ์„ ๋ฌธ์ž์—ด ํ˜•์‹์œผ๋กœ ๊ตํ™˜ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”์–ด๋ฐ์ดํ„ฐ ์—ญ์‹œ Dateํƒ€์ž…์—์„œ Stringํƒ€์ž…์œผ๋กœ ํ˜•์‹์„ ๋ฐ”๊ฟ”์•ผ ํ–ˆ๋Š”๋ฐ, lightweight migration ์—์„œ๋Š” ํƒ€์ž… ๋ณ€๊ฒฝ์„ ์ง€์›ํ•˜์ง€ ์•Š์•„์„œ ์ƒˆ๋กœ์šด ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ณ  ๋ฒ„์ „์„ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค. ์•„์ง ๊ฐœ๋ฐœ ์ค‘์ด์–ด์„œ ์ด๋ ‡๊ฒŒ ํ–ˆ์ง€๋งŒ ์‹ค์ œ ์„œ๋น„์Šค ์ค‘์ธ ์•ฑ์ด๋ผ๋ฉด ์ง์ ‘ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

3rd party ํ”„๋ ˆ์ž„์›Œํฌ ์ƒ์„ฑ ๋ฌธ์ œ

์–ด๋Š ์•ฑ์—์„œ๋‚˜ ์ €ํฌ๊ฐ€ ๋งŒ๋“  ์ด๋ฒคํŠธ ์ˆ˜์ง‘๊ธฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์„œ๋“œํŒŒํ‹ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ œ์ž‘์„ ๋ชฉํ‘œ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๊ธฐ๊ธฐ์˜ iOS์™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ iOS์˜ CPU ์•„ํ‚คํ…์ณ๊ฐ€ ๋‹ฌ๋ผ Universal Framework๋ฅผ ์ œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ์ธํ„ฐ๋„ท์— ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋‚˜์˜ค๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์ž˜ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ์™œ ๊ทธ๋Ÿฐ์ง€ ๋ชฐ๋ผ์„œ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ๋Š”๋ฐ, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•œ์ค„ํ•œ์ค„ ๋ณด๋‹ค ๋ณด๋‹ˆ iOS ๋นŒ๋“œ์™€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๋นŒ๋“œ๋ฅผ ํ•ฉ์น˜๋Š” lipo ๋ช…๋ น์–ด๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Apple์—์„œ M1 CPU๋ฅผ ์ถœ์‹œํ•˜์—ฌ ARM CPU๋ฅผ ์ง€์›ํ•˜๋ฉด์„œ ์ด์ œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋„ arm64 ์•„ํ‚คํ…์ณ๊ฐ€ ํฌํ•จ๋˜์–ด ์ค‘๋ณต๋˜์–ด ํ•ฉ์ณ์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋นŒ๋“œ ์˜ต์…˜์œผ๋กœ arm64๋ฅผ ์ œ์™ธํ•˜์—ฌ ๋‹ค์‹œ ์‹œ๋„ํ•˜์—ฌ Universal Framework๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฐ”๋กœ ๋‹ค์Œ๋‚  Xcode์˜ 12.3 ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๊ณ  ๋‚˜๋‹ˆ ์ด๋ฒˆ์—” ์„œ๋“œํŒŒํ‹ฐ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋นŒ๋“œ๋ฅผ ์ œ๋Œ€๋กœ ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ Xcode์˜ ๋ฌธ์ œ์—ฌ์„œ ์ €ํฌ๊ฐ€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ๊ฒฐ๊ตญ CocoaPod์„ ์ด์šฉํ•ด ๋ฐฐํฌํ•˜๋ฉด์„œ ๋” ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹คํฌ๋ชจ๋“œ

๋„ค์ด๋ฒ„ VIBE ์•ฑ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ UI๊ฐ€ ๊ฒ€์ •์ƒ‰์œผ๋กœ ๋˜์–ด ์žˆ์–ด ๊ฐœ๋ฐœ ์ดˆ๊ธฐ์—๋Š” ๋‹คํฌ๋ชจ๋“œ๋ฅผ ๋”ฐ๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ VIBE์—๋„ ํฐ์ƒ‰์˜ ํ…Œ๋งˆ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹คํฌ๋ชจ๋“œ/๋ผ์ดํŠธ๋ชจ๋“œ ๊ตฌํ˜„์„ ์œ„ํ•ด Color scheme์„ ๋‚˜๋ˆ„์–ด์„œ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ๊ตฌํ˜„ํ•˜๊ณ  ๋‚˜๋‹ˆ ๋‹คํฌ๋ชจ๋“œ๋ฅผ ์ปจํŠธ๋กคํ• ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด iOS์— ์žˆ์–ด์„œ ๋‹จ์ผ ์•ฑ ํ•˜๋‚˜์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜๋กœ ๋‹คํฌ๋ชจ๋“œ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹น์—ฐํžˆ ๋‹คํฌ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ๋„ VIBE์˜ ๊ธฐ๋ณธ ์ƒ‰์ƒ์ธ ์–ด๋‘์šด ํ…Œ๋งˆ๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ• ์ค‘ preferredColorScheme์„ ๋ทฐ์— ์ง€์ •ํ•ด ์ฃผ์–ด ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ modal ๋ทฐ๊ฐ€ ์˜ฌ๋ผ์˜ค๋Š” ๋ถ€๋ถ„๊ณผ ๊ฐ™์ด ํ•˜์œ„ ๋ทฐ๊ฐ€ ์•„๋‹Œ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ถ€๋ถ„์—์„œ๋Š” ๊ฐ๊ฐ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ์ด์Šˆ

์•ฑ์ด ์‹œ์ž‘ํ•˜์ž๋งˆ์ž ๋ณด์ด๋Š” Today ๋ทฐ๋Š” ๊ตฌํ˜„ํ•œ ๋ทฐ ์ค‘์—์„œ ๊ฐ€์žฅ ๋ณต์žกํ•œ ๋ทฐ์ž…๋‹ˆ๋‹ค. ๋ทฐ์— ๋ณด์ด์ง€ ์•Š๋Š” ๋ถ€๋ถ„์€ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•˜์ง€ ์•Š๋Š” LazyVStack๊ณผ ๋ชจ๋‘ ๋กœ๋“œํ•˜๋Š” VStack์˜ ๋‘์ข…๋ฅ˜ ์ค‘ ์–ด๋Š ๋ถ€๋ถ„์„ ์“ธ์ง€ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, Lazy๋Š” ์ •๋ง ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์—ˆ๊ณ , ๋ช‡ ๊ฐ€์ง€ ์ปจํ…์ธ ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ๋Š” ์ €ํฌ์˜ ๋ทฐ์™€๋Š” ๋งž์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ง‰์ƒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋‹ˆ ์–ด์งธ์„œ์ธ์ง€ LazyVStack์ด cpu ๊ฒŒ์ด์ง€๋„ 20ํ”„๋กœ๋Œ€์— ๋จธ๋ฌผ๊ณ  ์Šคํฌ๋กค์ด ๋งค๋„๋Ÿฌ์šด ๋ฐ˜๋ฉด ์˜คํžˆ๋ ค ๋ฏธ๋ฆฌ ๋กœ๋“œ๋ฅผ ํ•˜๋Š” VStack์ด ๋กœ๋”ฉ์‹œ๊ฐ„์„ ์ถฉ๋ถ„ํžˆ ์ฃผ์–ด๋„ cpu ์‚ฌ์šฉ๋Ÿ‰์ด 100ํ”„๋กœ์— ๋‹ค๊ฐ€๊ฐ€๋ฉฐ ๋” ์„ฑ๋Šฅ์ด ๋‚˜์˜ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ญ”๊ฐ€ ์ž˜๋ชปํ•œ ๊ฑธ ์ˆ˜๋„ ์žˆ์–ด ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ ๋ฉ”๋ชจ๋ฆฌ ์ด์Šˆ๊ฐ€ ์žˆ๋‹ค๋Š” ๋“ฏ ํ–ˆ์ง€๋งŒ ํ™•์‹คํ•œ ์ด์œ ๋Š” ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ LazyVStack์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์™ธ ์ด์Šˆ

๊ฐœ๋ฐœํ•˜๋Š” ๋‚ด๋‚ด ๋ญ”๊ฐ€ ์ž์ž˜ํ•œ SwiftUI ํƒ“์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜์–ด์ง€๋Š” ๋ฒ„๊ทธ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค UIKit ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ์—๋„ ๊ทธ๋ ‡๊ธด ํ–ˆ๋Š”๋ฐ, ๋นŒ๋“œ๋ฅผ ํด๋ฆฐ์‹œํ‚ค๊ฑฐ๋‚˜ Xcode์˜ DerivedData๋ฅผ ๋น„์›Œ์ฃผ๋‹ˆ ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋˜ ์ค‘ iPad mini5 ์‹ค์ œ ๊ธฐ๊ธฐ ๋™์ž‘์—์„œ ๊ฐ‘์ž๊ธฐ CPU ๊ฒŒ์ด์ง€๊ฐ€ 100ํ”„๋กœ์—์„œ ๊ณ ์ •๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์•ฑ ์‹œ์ž‘ ํ›„ ์•„๋ฌด๋Ÿฐ ๋™์ž‘์„ ์ทจํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ๋„ ์ตœ๋Œ€์น˜๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์•ฑ์ด ๋ฉˆ์ถ”์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ ๊ธฐ๊ธฐ์—์„œ๋งŒ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ, ์•ฑ์„ ์žฌ์„ค์น˜ํ•ด๋„ ๋‚˜์•„์ง€์ง€ ์•Š์•„ ํ˜น์‹œ๋‚˜ ํ•˜๋Š” ๋งˆ์Œ์— iPad๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋‹ˆ ํ•ด๊ฒฐ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋งŒ ์กด์žฌํ•˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ€๋กœ์Šคํฌ๋กค ๋ทฐ์™€ ์Šคํƒ๋ทฐ๋ฅผ ์กฐํ•ฉํ•ด ๊ตฌํ˜„ํ•œ ๋ถ€๋ถ„์—์„œ ๋ถ„๋ช…ํžˆ ๊ฐ€๋กœ ์Šคํฌ๋กค์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์„ธ๋กœ๋กœ๋„ ์Šคํฌ๋กค์ด ๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์‹ค์ œ ๊ธฐ๊ธฐ์—์„œ๋Š” ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ ๋‹คํ–‰์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํšŒ์ „ ์ธ์‹

ํ™”๋ฉด์ด ํšŒ์ „ํ–ˆ์„๋•Œ ๋ทฐ๊ฐ€ ๋‹ค์‹œ ๊ทธ๋ ค์ง€๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ ๊ทธ๋ ‡์ง€ ์•Š์•„์„œ, UIScreen.main.bound๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ GeometryReader๋ฅผ ์ ์šฉํ•ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„์ดํŒจ๋“œ ํ˜ธํ™˜

LazyVGrid์—์„œ adaptive๋ฅผ ์ ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ™”๋ฉด ํฌ๊ธฐ์— ๋งž์ถฐ์„œ ์…€๋“ค์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, MiniVibe์•ฑ์˜ UI๋Š” VerticalScroll์•ˆ์— HorizontalScroll์ด ์žˆ๋Š” ๊ตฌ์กฐ์—ฌ์„œ LazyVgrid์˜ adaptive๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์…€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์ ์šฉ์‹œ์ผœ์คฌ์Šต๋‹ˆ๋‹ค.

Clone this wiki locally