
[ ์ธ์ ์๊ฐ ]
์ด ์ธ์ ์์๋ ๋ค์ฑ๋กญ๊ณ ์ฌ์ฉํ๊ธฐ ์ข์ ์ฑ์ ๋ง๋ค๊ธฐ ์ํด ์๊ฐ ํจ๊ณผ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃจ๊ณ ์๋ค !
์๊ฐํจ๊ณผ๋ ํน์ ๊ธฐ๋ฅ์ด ์์๋๋ก ์๋ํจ์ ๋ณด์ฌ์ฃผ๊ณ , ์ฑ ํ๋ฉด์ ๊ฐ์ฑ์ ๋ํ๊ณ , ์งํ์ค์ธ ์ค์ํ ์ผ์ ์ฃผ์๋ฅผ ์ง์ค ์ํค๋ ์ญํ !
์๋ก์ด ์๊ฐํจ๊ณผ๋ฅผ ๋ง๋ ๋ค ? ๋น๋๋ฅผ ์์ํ๊ธฐ ์ ์๋ ๋ฌด์์ด ์ ํฉํ์ง ์ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์.
์ธ์ ์์ ๋ง๋ค์ด๋ณผ ์๊ฐํจ๊ณผ๋ค

- SwiftUI๋ก ๋ง์ถคํ ์คํฌ๋กค ํจ๊ณผ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
- ๋ฉ์ ๊ทธ๋ผ๋์ธํธ๋ก ์ฑ์ ํ๋ถํ ์์์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ
- ๋ง์ถคํ ๋ทฐ ์ ํ์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ
- ํ ์คํธ ๋ ๋๋ง์ผ๋ก ๊ทผ์ฌํ ํ ์คํธ ์ ํ์ ๋ง๋๋ ๋ฐฉ๋ฒ
- ๊ธ์ ์ ฐ์ด๋๋ฅผ ์์ฑํ์ฌ ๊ณ ๊ธ ๊ทธ๋ํฝ ํจ๊ณผ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
โฌ๏ธ Scroll effects
- ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋๋ถ๋ถ์ ์ฑ ๊ฒฝํ์ ์คํฌ๋กค ํ๋ฉด์ ํ์ธํ๋ ํญ๋ชฉ์ ๋ชจ์.

- .scrollTargetBehavior(.paging) : ํ์ด์ง ๋์์ ์ฌ์ฉํ์ฌ ํ์ด์ง ๋๋๊ธฐ ํจ๊ณผ ์ ์ฉ.

- scrollTransitions ์์ ์๋ ํ์ค์ ์ธ ์์ ๋ชจ์์ ๋ง์ถคํ ๋ชจ์์ผ๋ก ๋ณ๊ฒฝํ ๋ ์ฌ์ฉํ ์ ์๋ค.
- scrollTransition์ ์ ํํ๋ ค๋ content์ phase๋ฅผ ๋ ธ์ถ ์ํด
- ์ด๋ฌํ ๊ฐ์ ์ฌ์ฉํ์ฌ ์คํฌ๋กค๋ทฐ์์ ํ์ ์์ ์ฌ์ง๋ณ offset์ ๋ณ๊ฒฝํ ์ ์์. ( ์ฌ์ง์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก )
- ์คํฌ๋กค ํ๋ฉด ์์ชฝ์์ ์ด์ด์ง๋ ์ฌ์ง์ด ํ์ ํ๋ฉด์ ์ํ ์บ๋ฌ์ ํจ๊ณผ๋ฅผ ๋ง๋ฌ.
- value ์์ฑ์ ํตํด ์ด๋ฏธ์ง๊ฐ ํ๋ฉด์์ ๋จ์ด์ง ๊ฑฐ๋ฆฌ๋ฅผ ๊ฒฐ์
- ๋ทฐ๊ฐ ํ๋ฉด์ ์์ ํ ํ์๋๋ฉด isIdentity ์์ฑ์ด true ๊ฐ ๋จ
์์ธํ ์ค๋ช ํ์๋ฉด,
content: ์ค์ ๋ณด์ฌ์ง ๋ทฐ (์ฌ๊ธฐ์ AnimalPhoto)
phase: ๋ทฐ๊ฐ ์คํฌ๋กค ์ค ์ด๋ ์์น์ ์๋์ง๋ฅผ ๋ํ๋ด๋ ์ ๋ณด
phase.value: -1.0 ~ 1.0 ๋ฒ์. ์ค์์ ๊ฐ๊น์ธ์๋ก 0
- ์: ์ผ์ชฝ์ ์์ ๋ ์์, ์ค๋ฅธ์ชฝ์ ์์ ๋ ์์
phase.isIdentity: ๋ทฐ๊ฐ ํ์ฌ ์ค์ฌ(์จ์คํฌ๋ฆฐ ์ค์ฌ ์์น) ์ ์์ผ๋ฉด true, ์๋๋ฉด false
๐จ ํจ๊ณผ ์ค๋ช
๐ .rotationEffect(.degrees(phase.value * 2.5))
์คํฌ๋กค ์ค์ ์ด๋ฏธ์ง๋ฅผ ํ์ ์ํด
phase.value์ ๋ฐ๋ผ ์ข์ฐ๋ก ํ์
์ผ์ชฝ์ ์์์๋ก ์์ ๊ฐ → ์ผ์ชฝ์ผ๋ก ํ์
์ค๋ฅธ์ชฝ์ ์์์๋ก ์์ ๊ฐ → ์ค๋ฅธ์ชฝ์ผ๋ก ํ์
phase.value๊ฐ -1.0์ผ ๊ฒฝ์ฐ → -2.5๋ ํ์ (์ผ์ชฝ์ผ๋ก)
phase.value๊ฐ 0์ผ ๊ฒฝ์ฐ → 0๋ ํ์ (์ค์)
phase.value๊ฐ 1.0์ผ ๊ฒฝ์ฐ → +2.5๋ ํ์ (์ค๋ฅธ์ชฝ์ผ๋ก)
โฌ๏ธ .offset(y: phase.isIdentity ? 0 : 8)
์ด๋ฏธ์ง๊ฐ ์ค์์ ์์ง ์์ผ๋ฉด ์ฝ๊ฐ ์๋๋ก ์ด๋
์คํฌ๋กค ์ค ์ด๋ฏธ์ง๊ฐ ์์ ์์ ๋ y: 8 → ์๋๋ก 8pt ์ด๋
์ค์ฌ์ ์์ผ๋ฉด y: 0 → ์๋ ์์น

- modifier๋ฅผ ๋ณ๊ฒฝํ์ฌ scrollTrasition์ ์ ๋ฐ์ดํธ
- ์ด๋ฏธ์ง์ xOffset์ ๋ณ๊ฒฝํ๋ ์ด๋ฏธ์ง๋ฅผ ์๋ฅด๋ ๋ชจ์์ ๋ฐ๊พธ์ง ์๋๋ค.



- visualEffect๋ฅผ ์ถ๊ฐํ๋ฉด content ํ๋ ์ด์คํ๋์ proxy์ ์ ๊ทผํ ์ ์์.
- content ํ๋ ์ด์คํ๋์ ์๋ ๋ฐฉ์์ scrollTransition์์์ ๋์ผ
- proxy๋ ๋ทฐ์ ์ง์ค๋ฉํธ๋ฆฌ ๊ฐ์ ์ ๊ณต
- proxy์ ๋ทฐ์ ์์น๋ฅผ ์ฌ์ฉํ์ฌ ๋ทฐ์ ์์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ฉ์ง ๊ทธ๋ผ๋์ธํธ ํจ๊ณผ๊ฐ ๋ง๋ค์ด์ง
- visualEffect๋ฅผ ์ฌ์ฉํ๋ฉด ๋ทฐ์ ์์น์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์๊ฐ์ ์์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ผ๋ฏ๋ก ์คํฌ๋กค๋ทฐ์์ ์ฌ์ฉํ๊ธฐ ์ข์.
1. .hueRotation(Angle(degrees: ... ))
์ด๊ฑด ์์กฐ(Hue) ๋ฅผ ํ์ ์ํค๋ modifier์์.
Angle(degrees:) ์์ ๋ฃ๋ ์ซ์๋งํผ ์์ ์คํํธ๋ผ์ด ํ์ ๋ผ์, ๋ณด๋ผ์ → ๋นจ๊ฐ → ์ฃผํฉ → ๋ ธ๋ … ์ด๋ฐ ์์ผ๋ก ์์ด ๋ณํํจ
์ฆ, ์ ์ฝ๋์์๋ ๋ทฐ์ ์์ง ์์น์ ๋ฐ๋ผ ์์ด ๋ฌ๋ผ์ง
2. proxy.frame(in: .global).origin.y
๐งฑ proxy
.visualEffect { content, proxy in ... } ๊ตฌ๋ฌธ ์์ proxy๋ ํด๋น ๋ทฐ์ ๋ ์ด์์ ์ ๋ณด๋ฅผ ๊ณ์ฐํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ์ฒด์์.
๐ฆ proxy.frame(in: .global)
์ด๊ฑด ๋ทฐ์ ํ๋ ์์ ์ด๋ค ์ขํ๊ณ์์ ๊ณ์ฐํ ์ง ์ง์ ํ๋ ๊ฑฐ์์. .global์ ์ฐ๋ฉด → ์คํฌ๋ฆฐ ์ ์ฒด ๊ธฐ์ค์ผ๋ก ์์น๋ฅผ ๋ฐํํจ
๐ .origin.y
์ ์ฒด ์คํฌ๋ฆฐ ๊ธฐ์ค์์ ์ด ๋ทฐ์ y์ขํ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ ์ฆ, ํ์ฌ ๋ทฐ๊ฐ ์คํฌ๋ฆฐ์ ์ด๋ ์ธ๋ก ์์น์ ์๋์ง๋ฅผ ์๋ฏธ
์: ๋งจ ์ ๋ทฐ์ origin.y๋ 100์ฏค ์๋๋ก ๊ฐ์๋ก origin.y ๊ฐ์ด ์ปค์ง → ๊ทธ๋์ ์๋์ ์์์๋ก ๋ ๋ง์ด ์์ด ํ์
3. / 10 — ์ ๋๋๊น?
origin.y๋ ๋ณดํต ์์ญ~์๋ฐฑ pt์ธ๋ฐ, ์ด๊ฑธ ๊ทธ๋ฅ ํ์ ๊ฐ๋๋ก ์ฐ๋ฉด ์์ด ๋๋ฌด ๋นจ๋ฆฌ ๋ฐ๋
๊ทธ๋์ 10์ผ๋ก ๋๋ ์ ๋ณํ ํญ์ ์กฐ์ ํ๋ ๊ฒ ์: y=200 → 200 / 10 = 20๋ ์์ ํ์


- ๋ํ๊ณผ ๋์ผํ y์์น๋ฅผ ์ฌ์ฉํ์ฌ ์คํฌ๋กค๋ทฐ ์๋จ์์๋ ์์์ ์คํ์ , ํฌ๊ธฐ์กฐ์ , ํ์ด๋ ๋ฐ ๋ธ๋ฌ ํจ๊ณผ๋ฅผ ์ ์ฉ
๊ฒฐ๋ก : ScrollTransition๊ณผ VisualEffect๋ ์ปค์คํ ์คํฌ๋กค๋ทฐ ํจ๊ณผ์ ๋งค์ฐ ์ ์ฉํ๋ค

- ํ๋ฉด์์ ์์์ ์์น์ ๋ฐ๋ผ ์ค์ผ์ผ์ ์กฐ์ ํ๋ ์คํฌ๋กค๋ทฐ๋ฅผ ๋ง๋ค ์ ์์
- ์๊ทผ๊ฐ์ ๋ฐ๊พธ๊ธฐ ์ํด ํ์ฉํ ์ ์์ ( ํ์ ๋ฐ ๊ธฐ์ธ์ด๊ธฐ์ ๊ฐ์ ๋ณํ ํจ๊ณผ )
- ์คํ์ ์ ํตํด ์คํ ๋์ ๋ง๋ค๊ธฐ
- ๋ฐ๊ธฐ, ์ฑ๋, ์์กฐ์ ๊ฐ์ ์์ ์์ฑ์ ์กฐ์ ํ์ฌ ๋ด์ฉ์ ๊ฐ์กฐํ๊ณ ๋ช ํํ๊ฒ ํ์
๐ Color treatments
- ์์์ ์ธํฐํ์ด์ค์ ์ค์ํ ์ญํ ์ ํจ. ์ฑ์ ๊ฐ์ฑ์ ๋ํ๊ฑฐ๋, ์ฃผ์๋ฅผ ์ง์ค์ํค๊ฑฐ๋ ์๋๋ฅผ ๋ช ์ํ ์ ์์.
- SwiftUI๋ ์ฑ์ ์์์ ์ ์ฉํ๋ ๋๊ตฌ๋ฅผ ๋ค์ํ๊ฒ ์ ๊ณต.

-> ๋ค์ํ ๊ทธ๋ผ๋์ธํธ ์ ํ, ์์ ์ปจํธ๋กค ๋ธ๋ ๋ ๋ฑ์ ์ง์

- SwiftUI๋ ๋ฉ์ ๊ทธ๋ผ๋์ธํธ๋ ์ง์.
- ๋์ ๋ฐฐ๊ฒฝ์ ์ ์ฉํ๊ฑฐ๋ ํ๋ฉด์ ์๊ฐ์ ๊ตฌ๋ถ์ ์ถ๊ฐํด์ผ ํ ๋ ์ ์ฉ

- ๋ฉ์ ๊ทธ๋ผ๋์ธํธ๋ ์ ์ ๊ทธ๋ฆฌ๋๋ก ๋ง๋ค์ด์ง๊ณ , ๊ฐ ์ ์ ์์๊ณผ ์ฐ๊ด๋์ด ์์

- ์ ์ ์ด๋ํ๋ฉด ์์ํจ๊ณผ๋ฅผ ๋ง๋ค ์ ์์. ๋งค๋๋ฝ๊ฒ ๋ธ๋ ๋ฉ. ๊ฐ๊น์ด ์ ์ ์์์ด ๋ ์ ๋ช ํ๊ฒ ์ ํ

- width ๋ฐ height ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ฆฌ๋์ ํ๊ณผ ์ด์ ์ ์ : 3 x 3 ๊ทธ๋ฆฌ๋
- ๊ทธ๋ฆฌ๋ ๋ด X ๋ฐ Y ์ขํ์ ์์น๋ฅผ ์ ์
- ๊ทธ๋ฆฌ๋ ๋ด ์ ์ SIMD2 float ๊ฐ์ผ๋ก ์ ์๋จ. X ๋ฐ Y ์ถ์์ 0๋ถํฐ 1๊น์ง์ ๊ฐ์ ๊ฐ์ง
SIMD2<Float>๋ x, y ์ขํ ํ ์์ ์ ์ฅํ๋ ๊ตฌ์กฐ์ฒด
๐น SIMD๋?
SIMD = Single Instruction, Multiple Data → ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๊ณ์ฐํ ์ ์๊ฒ ํด์ฃผ๋ ๊ณ ์ฑ๋ฅ ๋ฒกํฐ ์ฐ์ฐ ๊ธฐ์
Swift์์๋ ์ด๊ฑธ ์ํด SIMD2, SIMD3, SIMD4 ๊ฐ์ ํ์ ์ ์ ๊ณตํด์.
์ : let point = SIMD2<Float>(0.3, 0.7)
- ๋ง์ง๋ง์ผ๋ก ๊ฐ ์ ์ ํด๋นํ๋ ์์ ์ถ๊ฐ


- ํ๋ฉด ์์์ ์ด๋ฏธ์ง์ ๋ง์ถฐ ๋ฐ๊พธ๊ฑฐ๋ ๋ฉ์ ๊ทธ๋ผ์ด์ธํธ ์ ๋๋ฉ์ด์ ์ผ๋ก ๋ณ๊ฒฝ ์ฌํญ์ด ์์์ ์๋ฆด ์ ์์
๐ณ View transitions
- ์ฌ์ฉ์๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ด๋ค ์์ ์ ์ํํ๋์ง ์ ์ ์์
- Trasition์ ์ผ์ด๋๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ ๋ฌํ ๋ ์ ์ฉ
์) ๋ฒํผ์ ํญํ ๋ , ์ฌ์ฉ์๊ฐ ์์๋ฅผ ๋๋๊ทธ

- ์๋ฐํ๋ทฐ : ์ฌ์ฉ์์ ์จ๋ผ์ธ ์ํ์ ๋ฐ๋ผ ํ์๋๊ฑฐ๋ ์จ๊ฒจ์ง. ์ฌ์ฉ์๊ฐ ์จ๋ผ์ธ ์ํ๋ฉด ํ์๋๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์จ๊ฒจ์ง๋๋ก
- transition ์ค scale ์ ์ฉ : ์๋ฐํ๊ฐ ๋ฑ์ฅํ๊ณ ์์ด์ง ๋ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์.

- combined ๋ฉ์๋๋ก ๋ค๋ฅธ transition ์ถ๊ฐ ๊ฐ๋ฅ
- scale ์ ํ๊ณผ opacity ์ ํ ๊ฐ์ด ์ฌ์ฉ
Custom transition

- ์ปค์คํ ํธ๋์ง์ ์ ๋ง๋ค๊ธฐ ์ํด ์ struct ์์ฑ : Twirl
- Transition ํ๋กํ ์ฝ ์ค์
- Transition ๋ณธ๋ฌธ ํจ์๋ content์ phase ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉ
- content ๋งค๊ฐ๋ณ์์ ์๋ ๋ฐฉ์์ ์คํฌ๋กค๋ทฐ์์์ ๋ฐฉ์๊ณผ ๊ฐ์ : ์ ํํ ์ฝํ ์ธ ์ ๋ํ ํ๋ ์ด์ค ํ๋๋ก ์๋
- phase๊ฐ์ผ๋ก ๋ทฐ๊ฐ ํ์ฌ ํ์๋๋์ง ํ์ธํ ์ ์์ผ๋ฉฐ ์ด๋ฅผ ํ์ฉํ์ฌ ๋ทฐ์ ์กฐ๊ฑด๋ถ ์คํ์ผ ์ ์ฉ
- scale์ ๊ฒฝ์ฐ, ๋ทฐ๋ฅผ ํ์ํ ๋๋ ์ต๋ ์ค์ผ์ผ๋ก ํ์ํ๊ณ ํ์ํ์ง ์์ ๋๋ ์ค์ผ์ผ์ ์ ๋ฐ์ผ๋ก ์ง์
- opacity์ ๊ฒฝ์ฐ, ์์๊ฐ ์์ ํ ํ์๋๋ ์ํ์ ์จ๊ฒจ์ง๋ ์์ฑ๋ฅผ ์ ํํ๋๋ก ์ค์


- ๋ธ๋ฌ ์ถ๊ฐํ์ฌ ์๋ฐํ๊ฐ ์ด์ ์ ๋ค์ด์ค๊ณ ๋๊ฐ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋๋ก, ํ์ ๋ ์ถ๊ฐํ์ฌ ์๋ฐํ๊ฐ ๋๋๋ก

- phase ๊ฐ์ ํ์ธํ๋ฉฐ ๋ณด๊ธฐ๊ฐ ํ์๋ ์ง ๋๋ ์ฌ๋ผ์ก๋์ง ์์ ์์ -> ์๋ฐํ๊ฐ ์ฌ๋ผ์ง ๋๋ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋๋ก ( ์์๊ฐ ์ฌ์ฉ )
- brightness ์์ ์๋ฅผ ์ถ๊ฐํ์ฌ ๋ทฐ๊ฐ ํ์๋ ๋ ์ฝ๊ฐ์ ๋น์ ๋ด์ด ์์ ์ ๋๊ฒ
๐ฌ Text transitions

- ํ ์คํธ ๋ผ์ธ๋ง๋ค ์ ๋๋ฉ์ด์ ์ถ๊ฐ
- TextRenderer : iOS18 ๋ฐ ๊ด๋ จ ๋ฆด๋ฆฌ์ฆ์ ๋์ ๋ ์ API
- ๊ฐ๋ ฅํ ํ๋กํ ์ฝ์ธ TextRenderer์ ์ฌ์ฉํ๋ฉด ๋ทฐ ํธ๋ฆฌ ์ ์ฒด์์ SwiftUI ํ ์คํธ๊ฐ ๊ทธ๋ ค์ง๋ ๋ฐฉ์์ ์ปค์คํ ํ ์ ์์

- TextRendererํ๋กํ ์ฝ์ ํต์ฌ์ draw(layout:in:) ๋ฉ์๋
- ์ด ๋ฉ์๋์ ์ธ์๋ Text.Layout , GraphicsContext
- Text.Layout : ํ ์คํธ์ ๊ฐ๋ณ ๊ตฌ์ฑ์์์ธ ๋ผ์ธ, ๋ฐ, ๊ธ๋ฆฌํ์ ์ ๊ทผํ ์ ์๋๋ก ํจ
- GraphicsContext : ์บ๋ฒ์ค๋ทฐ์์ ์ฌ์ฉ๋๋ ๊ฒ๊ณผ ๊ฐ์.
- for ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ด์์์ ๊ฐ๋ณ ๋ผ์ธ์ ๋ฐ๋ณตํ๊ณ ์ปจํ ์คํธ์ ๊ทธ๋ฆผ => ๊ธฐ๋ณธ ๋ ๋๋ง ๋์

- ์ ํ ์ ๋๋ฅผ ์ํด ์์ฑ 3๊ฐ๋ฅผ ์ถ๊ฐ
1. elapsedTime : ์ง๊ธ๊น์ง ๊ฒฝ๊ณผํ ์๊ฐ์ ์ง์
2. elementDuration : ๊ฐ๋ณ ๋ผ์ธ์ด๋ ์์์ ์ ๋๋ฉ์ด์ ์ ํ์ํ๋๋ฐ ์ฌ์ฉํ ์๊ฐ
3. totalDuration : ์ ์ฒด ์ ํ์ ์์๋๋ ์๊ฐ
-> SwiftUI๊ฐ elapsedTime ๊ฐ์ ์๋์ผ๋ก ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ ์ ์๋๋ก Animatable ํ๋กํ ์ฝ ๊ตฌํ
- animatableData ์์ฑ์ elapsedTime์ผ๋ก ์ ๋ฌํ๋ฉด ๊ฐ๋จํ๊ฒ ์ฑํํ ์ ์์.

- ์ ๋๋ฉ์ด์ ๋ฐ๋ณต ์์ : ๋ผ์ธ๋ณ๋ก ์ ๋๋ฉ์ด์ ์ ์ฉ
- ์ ๋๋ฉ์ด์ ์ ์ฒด์ ์ฌ์ฉ๊ฐ๋ฅํ ์๊ฐ์ ๊ท ๋ฑํ๊ฒ ๋ถ๋ฐฐํ๋ ค๋ฉด ์ฐ์๋ ๋ ๋ผ์ธ ์ฌ์ด์ ์ง์ฐ ์๊ฐ์ ๊ณ์ฐํด์ผํจ.
- ํฌํผ ํจ์ ํธ์ถ : elementDelay(count:)
- ๋ชจ๋ ๋ผ์ธ์ ๋์ด : ์ธ๋ฑ์ค์ ํด๋น ์ง์ฐ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์๋์ ์ธ ์์ ์๊ฐ์ ๊ณ์ฐ
- ๊ฐ๋ณ ๋ผ์ธ์์ ๊ฒฝ๊ณผํ ์๊ฐ์ ์ ์ฒด ๊ฒฝ๊ณผ ์๊ฐ์์ ์์์ ๊ฐ๋ณ ์๊ฐ ์คํ์ ์ ๋บ ๊ฐ.
- ํ์ฌ GraphicsContext์ ์ฌ๋ณธ์ ๋ง๋ฌ.
-> GraphicsContext์ ๊ฐ ์๋งจํฑ์ด ์์ผ๋ฏ๋ก ํฌํผํจ์์ ๋ํ ๊ฐ๋ณ ํธ์ถ์ด ์๋ก ์ํฅ์ ์ฃผ์ง ์์
- ๋ง์ง๋ง์ผ๋ก ํฌํผ ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ฐ๋ณ ๋ผ์ธ์ ๊ทธ๋ฆผ
๐ง ์ ์ฒด ํ๋ฆ ์์ฝ
Text.Layout ์์ ์๋ ํ ์คํธ์ ๊ฐ ์ค(line) ์ ํ๋์ฉ ์ํํ๋ฉฐ
๊ฐ ์ค์ ๋ํด ์ง์ฐ(delay) ์ ์ฃผ๊ณ ์ผ์ ํ ๊ฐ๊ฒฉ์ผ๋ก ์ ๋๋ฉ์ด์ ๋๋๋ก
GraphicsContext๋ฅผ ๋ณต์ฌํ์ฌ ๊ฐ ์ค์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ทธ๋ฆผ
elementDelay(count:) :์ ์ฒด ์ ๋๋ฉ์ด์ ์๊ฐ์layout.count (์ค ๊ฐ์) ๋งํผ ๊ท ๋ฑํ๊ฒ ๋๋
→ ๊ฐ ์ค๋ง๋ค ์์ํ ์๊ฐ ๊ฐ๊ฒฉ
layout.enumerated() → ๊ฐ ์ค๊ณผ ์ธ๋ฑ์ค๋ฅผ ํจ๊ป ์ํ
์: (0, "์ฒซ ๋ฒ์งธ ์ค"), (1, "๋ ๋ฒ์งธ ์ค") ...
์ค ๋ฒํธ(i) × ์ค๋น ์ง์ฐ ์๊ฐ(delay) = ์ด ์ค์ ์์ ์๊ฐ ์คํ์
์: 0๋ฒ์งธ ์ค: 0์ด 1๋ฒ์งธ ์ค: 0.2์ด 2๋ฒ์งธ ์ค: 0.4์ด …
ํ์ฌ๊น์ง ๊ฒฝ๊ณผํ ์๊ฐ elapsedTime์์ ํด๋น ์ค์ ์คํ์ ์ ๋บ ๊ฐ์ elementTime์ผ๋ก ์ค์
๋จ, ์์๊ฐ ๋์ง ์๊ฒ max(0, ...) ํ๊ณ ์ต๋ ์ง์์๊ฐ elementDuration์ ๋์ง ์๊ฒ min(..., elementDuration)
โฑ๏ธ ์ฆ, ์ด ์ค์ ์งํ๋ฅ ์ ์๊ฐ์ ๋ฐ๋ผ ๊ณ์ฐํ๋ ๊ฒ!
- GraphicsContext๋ ๊ฐ ํ์ → ๋ณต์ฌํด์ ์จ์ผ ํจ
- ๊ทธ๋์ copy๋ผ๋ ์ฌ๋ณธ์ ๋ง๋ ํ, ๊ฐ ์ค ๊ทธ๋ฆฌ๊ธฐ์ฉ์ผ๋ก ๊ฐ๋ณ ์ฌ์ฉ
- ์ด ์ค์์ .draw(...) ํจ์๋ก ์ค์ ์ค์ ๊ทธ๋ฆฌ๋ ๋ก์ง ํธ์ถ!
๐ฌ ์ context ๋ณต์ฌํ๋๊ฐ?
Swift์ GraphicsContext๋ ๊ฐ ํ์ (value semantic)์ด๋ผ์
- ๊ทธ๋ฅ ์ฌ์ฉํ๋ฉด ์ด์ ์ค ๊ทธ๋ฆฐ ๊ฒฐ๊ณผ์ ์ํฅ์ ์ค ์ ์์
- ๊ทธ๋์ ๊ฐ ์ค๋ง๋ค ๋ ๋ฆฝ์ ์ธ copy ๋ฅผ ๋ง๋ค์ด์ ๋ถ์์ฉ ์์ด ์ฌ์ฉ




- ์ฒซ blurRadius๋ ๋ผ์ธ์ typographicBounds ์์ฑ์์ ์ฝ์ ๋ผ์ธ์ ๋์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํจ


- ๋ผ์ธ์ ๋์ผ๋ ๊ธธ์ด์ ๋ฐ๋ผ ์์ชฝ์ผ๋ก ์ด๋ํ๋ y์์น์์ ์์.
Baseline : ๊ธ์๊ฐ ์ ๋ ฌ๋๋ ๊ธฐ์ค์
๋๋ถ๋ถ์ ๊ธ์๋ ์ด ์ ์์ ์์น
Descender : ๊ธ์์ ์๋๋ก ๋ด๋ ค๊ฐ๋ ๋ถ๋ถ
g, y, j, p, q ๋ฑ์ ๊ผฌ๋ฆฌ ๋ถ๋ถ
์: g → ๋ฅ๊ทผ ์๋ ๊ผฌ๋ฆฌ ๋ถ๋ถ = descender
๋์ผ๋๋ฅผ ๊ณ ๋ คํ์ง ์์ผ๋ฉด
๊ธ์์ ๊ผฌ๋ฆฌ๊ฐ ์๋๋ก ๋จ์ด์ ธ์ ํ๋ฉด ๋ฐ์ผ๋ก ์๋ฆด ์ ์์
๋์ผ๋ ๊ธธ์ด๋งํผ ์๋ก ์ฌ๋ฆฌ๋ฉด
ํ ์คํธ ์ ์ฒด๊ฐ ์ ์ ํ ์์น์ ๊น๋ํ๊ฒ ๊ทธ๋ ค์ง

- ๋ง์ง๋ง์ผ๋ก ์ draw options ๋ฉ์๋๋ก ๋ผ์ธ์ ๊ทธ๋ฆผ
- ์๋ธ ํฝ์ ์์ํ๋ฅผ ํด์ ํ๋ฉด spring์ ์์ ํ ์ํค๊ณ ์งํฐ๋ฅผ ๋ฐฉ์งํ ์ ์์.
โ ํฝ์ ์์ํ(Quantization)
์ขํ๊ฐ์ด๋ ๊ทธ๋ํฝ ์์น๋ฅผ ์ ์ ๋จ์ ํฝ์ ์ ๋ง์ถฐ ๊ฐ์ ๋ก ๋๋ ๊ฒ์ ๋งํด์. ๋์งํธ ํ๋ฉด์ ํฝ์ ๋จ์๋ก ๊ทธ๋ฆฌ๊ธฐ ๋๋ฌธ์, ์ค์ ์ขํ(์: x = 23.6)๋ ๋ ๋๋ง ์ ๋ณดํต ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ ํฝ์ (24)๋ก ๋ฐ์ฌ๋ฆผํด์ ๊ทธ๋ฆฝ๋๋ค.
โ ์๋ธ ํฝ์ (Subpixel)
์ผ๋ถ ๊ทธ๋ํฝ ์์คํ ์ ์์์ ๋จ์ ์ขํ (์: x = 23.3) ๋ ๋ถ๋๋ฝ๊ฒ ๊ทธ๋ ค์ค์. ์ด๊ฑธ "์๋ธ ํฝ์ ๋ ๋๋ง"์ด๋ผ๊ณ ํด์
→ ๋ ์ ๋ฐํ ์์น ํํ
๐ต ๊ทธ๋ฐ๋ฐ ์์ํ๋ฅผ ํ๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ?
์ ๋๋ฉ์ด์ ์ค ์ขํ๊ฐ ๋ฏธ์ธํ๊ฒ ์์ง์ผ ๋, ์์ํ๋ก ์ธํด ์ขํ๊ฐ 'ํญํญ ๋๊ฒจ์' ๋ณด์ ์ด๊ฒ ๋ฐ๋ก "์งํฐ(jitter)", ์ฆ ์์ง์์ด ๋๋ ๋จ๋ฆฌ๋ ํ์
๐ฅ "Spring์ ์์ ํ์ํค๊ณ ์งํฐ๋ฅผ ๋ฐฉ์งํ๋ค"๋ ๋ป?
SwiftUI๋ UI ํ๋ ์์ํฌ์์ spring animation (์คํ๋ง ์ ๋๋ฉ์ด์ )์
→ ๋ง์น ํ์ฑ์ฒ๋ผ ์์ฐ์ค๋ฝ๊ฒ ์์ง์ด๋ ์ ๋๋ฉ์ด์
ํ์ง๋ง ์๋ธ ํฝ์ ์์ํ๊ฐ ์ผ์ ธ ์์ผ๋ฉด:
์ ๋๋ฉ์ด์ ๋์ค ์์น๊ฐ ์ ์ ํฝ์ ๋ก๋ง ์์ง์ด๊ฒ ๋๋ฉด์ ๋๋ ๋จ๋ฆฌ๊ฑฐ๋ ๋๊ธฐ๋ ๋๋(jitter)์ด ๋ ์ ์์ด์.
๊ทธ๋์ ์์ํ๋ฅผ ๊บผ์ฃผ๋ฉด:
spring ์ ๋๋ฉ์ด์ ์ด ๋ ๋ถ๋๋ฝ๊ณ ์์ ์ ์ผ๋ก ์๋ ์ขํ ๋ณํ๊ฐ ์ค์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ฐ์๋ ๊ฒ์ฒ๋ผ ํํ๋จ

- Renderer๋ก ํ ์คํธ์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ๋ ค๋ฉด ์ปค์คํ Transition ๊ตฌํ ํ์
- ํ์ฌ ํธ๋์ญ์ ์ ์ด๋ฏธ ์ ๋๋ฉ์ด์ ์ด ์์ ์ ์๋ค๋ ์ ๊ณ ๋ ค : ์ด Transition์ด withAnimation์ ๋ํ ํธ์ถ์์ ํธ๋ฆฌ๊ฑฐ๋ ๊ฒฝ์ฐ

- ํธ๋์ญ์ body view modifier๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ ํ ๋ ์ ๋๋ฉ์ด์ ์ฌ์ ์ ๊ฐ๋ฅ.
- ์ด๋ฌ๋ฉด ๋ชจ๋ ๋ผ์ธ์ ๋ํด ๊ท ์ผํ ์ ํ ํ์ด์ฑ ๋ณด์ฅ.
-> ๋ชจ๋ ์ค์ด ๊ฐ์ ์๋๋ก ์์ฐ์ค๋ฝ๊ฒ ๋ฑ์ฅํ๊ฒ ๋ง๋ค ์ ์๋ค๋ ๋ง !!
- ๊ทธ ๋ค์ ์๋ก์ด textRenderer ๋ทฐ ์์ ์๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋๋ ๋ทฐ์ ์ปค์คํ renderer๋ฅผ ์ค์

# ๋ผ์ธ ์์ ์์กดํ๋ ์ ํ ? ๋ผ์ธ ์๋ ๋ก์ผ์ผ์ด๋ Dynamic Type ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์์ ์ฃผ์ !

- ๊ธ๋ฆฌํ ๋ง๋ค ์ ๋๋ฉ์ด์ ์ ์ฉ. ๊ธ๋ฆฌํ ? ๊ทธ ๋ฌธ์๋ฅผ ์๊ฐ์ ์ผ๋ก ์ด๋ป๊ฒ ๊ทธ๋ฆด์ง ๊ฒฐ์ ๋ ๋ํ
- Text.Layout์ run ์ฌ๋ผ์ด์ค๋ฅผ ๋ฐ๋ณตํด์ผํจ. ์ด ์ฌ๋ผ์ด์ค๋ ๊ธ๋ฆฌํ๋ ๋ด์ฅ๋ ์ด๋ฏธ์ง์ฒ๋ผ ๋ ์ด์์์ ๊ฐ์ฅ ์์ ๋จ์๋ฅผ ๋ํ๋
Text.Layout ์์๋ run์ด๋ผ๋ ๋จ์๊ฐ ์์
run : ์ค(line) ์์์ ๋์ผํ ์คํ์ผ์ ๊ฐ์ง ์ฐ์๋ ํ ์คํธ ์กฐ๊ฐ
์ด run์ ๋ฐ๋ณต(iterate)ํ๋ฉด์ ๊ทธ ์์ ์๋ ๊ธ๋ฆฌํ(๊ธ์ ๋ชจ์) ๋๋ ์ด๋ฏธ์ง(์ด๋ชจ์ง, SF Symbol ๋ฑ) ๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌํด์ผ ํจ
์ด๊ฒ ํ ์คํธ ๋ ๋๋ง์ ๊ฐ์ฅ ์์ ๋จ์์ด๊ธฐ ๋๋ฌธ์ → ์ฌ๊ธฐ์ ์ ๋๋ฉ์ด์ , ์์, ๋ณํ ๋ฑ์ ๊ฑธ ์ ์์
๐ฏ ์ run ๋จ์๋ก ๋ฐ๋ณตํ๋?
ํ ์คํธ๋ฅผ ์ ๊ตํ๊ฒ ์ ์ดํ๊ธฐ ์ํด์์์.
๊ธ์ ํ๋ํ๋์ ์ ๋๋ฉ์ด์ ์ ๋ฃ๋๋ค๊ฑฐ๋ ์ด๋ชจ์ง๋ฅผ ๋ฐ๋ก ์์ง์ธ๋ค๊ฑฐ๋ ํน์ run๋ง ๊ฐ์กฐ ์ฒ๋ฆฌํ๋ ๋ฑ
→ run ๋จ์๋ก ์ ๊ทผํด์ผ ์ปค์คํ ์ฒ๋ฆฌ ๊ฐ๋ฅ

- Text.Layout์ ๋ผ์ธ์ ๋ชจ์. ๋ผ์ธ์ ๋ฐ์ ๋ชจ์์ด๊ณ , ๋ฐ์ RunSlice์ ๋ชจ์

- flattenedRunSlice๋ผ๋ ํฌํผ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด RunSlice๋ง ๋ฐ๋ณตํ๋ฉด ๋จ.

- ํฌํผํจ์๋ line ์ธ์์ ์ ํ๊ณผ ์ด๋ฆ์ RunSlice๋ก ๋ณ๊ฒฝ
# ํน์ ๊ธ์๋ง ๊ฐ์กฐ !
- TextAttribute ํ๋กํ ์ฝ ์ฌ์ฉ : iOS18 ๋ฐ ๊ด๋ จ ๋ฆด๋ฆฌ์ฆ์์ TextRenderer์ ํจ๊ป ๋์ , ์ด ํ๋กํ ์ฝ์ ๊ตฌํ๋ ํ๋ฉด ํ ์คํธ์์ TextRenderer๋ก ๋ฐ์ดํฐ ์ ๋ฌ ๊ฐ๋ฅ

- customAttribute text modifier๋ฅผ ์ฌ์ฉํ์ฌ Visual Effects ๋จ์ด๋ฅผ EmphasisAttribute๋ก ํ์.
- ํน์ ๋ฒ์์ ํ ์คํธ๋ฅผ ํ์ํ๋๋ฐ๋ง ์ฌ์ฉํ์ผ๋ฏ๋ก TextAttribute struct์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ถ๊ฐํ์ง ์์๋ ๋จ

- layout์ flattenedRuns ๋ฐ๋ณต
- Attribute-Type์ ํค๋ก ์ฌ์ฉํ๋ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ run์ EmphasisAttribute๊ฐ ์์์ ํ์ธ
1) ์์ฑ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ, ์ด์ ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฌ๋ผ์ด์ค ๋ฐ๋ณต
2) ์์ฑ์ด ์๋ ๊ฒฝ์ฐ, 0.2์ด์ ๊ฑธ์ณ run์์ ๋น ๋ฅด๊ฒ ํ์ด๋ ์ธ
๐ฅ Metal shaders
- shader : ๋ค์ํ ๋ ๋๋ง ํจ๊ณผ๋ฅผ ๊ธฐ๊ธฐ์ GPU์์ ๋ฐ๋ก ๊ณ์ฐํ๋ ์์ ํ๋ก๊ทธ๋จ
- SwiftUI์์๋ ๋ด๋ถ์ ์ผ๋ก ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์๊ฐํจ๊ณผ ๊ตฌํ
- iOS 17 ์ ๋์ ๋ SwiftUI ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ์ ์งํ๋ฉด์ ์๊ฐํจ๊ณผ ์์ฑ ๊ฐ๋ฅ.

- SwiftUI์์ Shader๋ฅผ ์ธ์คํด์คํํ๋ ค๋ฉด ShaderLibrary์์ Shader์ ์ด๋ฆ์ ๊ฐ๋ ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋จ.
- ์ถ๊ฐ ๋งค๊ฐ๋ณ์๋ฅผ Shaderํจ์์ ์ ๋ฌํ ์๋ ์์. ์์, ์ซ์, ์ด๋ฏธ์ง
- layerEffect๋ก ๋ทฐ์ ์ด ํจ๊ณผ ์ ์ฉ : SwiftUI๊ฐ ๋ทฐ์ ๋ชจ๋ ํฝ์ ์ ๋ํด Shaderํจ์ ํธ์ถ
๋ง์ ํฝ์ ์ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด Shader๋ ๊ณ ๋๋ก ๋ณ๋ ฌํ๋ ์์ ์ ์ต์ ํ๋ ๊ธฐ๊ธฐ์ GPU์์ ์คํ๋จ
GPUํ๋ก๊ทธ๋๋ฐ์ ํน์ฑ ์ Shader์์ฒด๋ Swift ๋ก ์์ฑํ ์ ์์.
-> Metal Shading Language ๋ก ์์ฑ. ( Metal ์ด๋ผ๊ณ ํจ )

- SwiftUI๋ ๊ฐ ๋ทฐ์ ํฝ์ ์ ๋ํด ์ด ํจ์๋ฅผ GPU์์ ์คํ
- ์คํ ์ position์ ํด๋น ํฝ์ ์ ์์น๋ฅผ ๋ํ๋
- layer๋ ๋ทฐ ์ฝํ ์ธ ๋ฅผ ๋ํ๋
- ๋ ์ด์ด๋ฅผ ์ํ๋งํด์ ์ฝํ ์ธ ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก Shader๊ฐ ์ธ์คํด์คํ๋ maxSampleOffset ๋ด์ ๋จธ๋ฌผ๋ฌ์ผ ํจ
- SwiftUI๋ ์์๊ณผ ๊ฐ์ ์ ํ์ Metal ์์ ์ฌ์ฉํ ์ ์๋ ํํ์ผ๋ก ํด๊ฒฐํ๊ณ ๋ณํ.
์ : ๋ถํ์ -> half4
- Metal์ ์ด๋ฌํ ์ ํ์ ๋ฒกํฐ๋ฅผ ๋ง์ด ์ฌ์ฉ.
- half4๋ 16๋นํธ ๋ถ๋ ์์์ ์ซ์ ํฌํจ, 4๊ฐ์ ๊ตฌ์ฑ์์๋ฅผ ๊ฐ๋ ๋ฒกํฐ
- ์ด ์ ํ์ ๋นจ๊ฐ, ๋ น์ , ํ๋ ๋ฐ ์ํ ๊ตฌ์ฑ์์๋ฅผ ์ธ์ฝ๋ฉ.
- float2 ๋ 32๋นํธ ๋ถ๋ ์์์ ์ซ์๋ฅผ ํฌํจ. 2๊ฐ์ ๊ตฌ์ฑ์์๋ฅผ ๊ฐ๋ ๋ฒกํฐ๋ก 2D ์ ์ด๋ ์ฐจ์์ ์ฃผ๋ก ์ฌ์ฉ

- SwiftUI์์ Shader๋
1. Custom Fills
2. Color Effects
3. Distortion effects
4. Layer effects
์ ํจ๊ณผ๋ค์ ์ฌ์ฉํ ์ ์๋ค.
3๊ฐ์ง ํจ๊ณผ์ค ๋ ์ด์ด ํจ๊ณผ๊ฐ ๊ฐ์ฅ ๊ฐ๋ ฅํ๊ณ ๋๋จธ์ง ๋ ํจ๊ณผ๋ฅผ ํฌํจํ๊ณ ์์

- ์ฌ์ฉ์๊ฐ ๋ทฐ๋ฅผ ํญํ ๋๋ง๋ค ํธ๋ฆฌ๊ฑฐ ๋๋ ํธ์ ํจ๊ณผ๊ฐ ์ ์ฉ๋์ด ์์
- ๋ทฐ๋ spring์ ํตํด ํฌ๊ธฐ๊ฐ ์์์ง๋ค๊ฐ ์ฆ์ ๋ค์ ์ฌ๋ผ์ด.
=> ํ์ง๋ง, ํญํ๋ ์์น์์ ์ ๋๋ฉ์ด์ ์ด ์๋ตํ๋ ๊ฒ์ด ์๋๋ผ ์ธ์์ ์ด๊ณ ๊ฒฝ์ง๋ ๋๋ ?
๐ฌ ๋ทฐ๋ฅผ ๋๋ฅผ ๋๋ง๋ค ๋๋ฅธ ์์น์์๋ถํฐ ์ค์ผ์ผ ํจ๊ณผ๊ฐ ๋ฐ๊นฅ์ชฝ์ผ๋ก ํผ์ง๋๋ก ํ๊ณ ์ถ๋ค !
: Shader๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.

- Metal ํ์ผ์ ์ ์ ฐ์ด๋ ํจ์๋ฅผ ์ถ๊ฐ : Ripple
- ๋ ์ด์ด ํจ๊ณผ์ API์ ํ์ํ ์ธ์ 2๊ฐ์ง ์ถ๊ฐ : position, layer
- ๋ทฐ๊ฐ ๋๋ฆฐ ์ง์ , ๊ฒฝ๊ณผ๋ ์๊ฐ, ๊ทธ ์ธ 4๊ฐ ๋งค๊ฐ๋ณ์์ ๋ํ ํจ์
- ํฝ์ ์ ๋ํ ์๊ณก์ ๊ณ์ฐํ์ฌ ์๋ก์ด newPosition์ ์ป์ => ๋ทฐ๋ฅผ ์ํ๋ง
- ์๊ณก์ ๋ฐ๋ผ ์ฝ๊ฐ์ ์กฐ์ ํ ์์ ๋ ์์์ ๋ฐํ

- SwiftUI์์ ์ ฐ์ด๋ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ํด RippleModifier๋ผ๋ ViewModifier๋ฅผ ๋ง๋ฌ
- ์ ฐ์ด๋ ํจ์์ ๋ชจ๋ ๋งค๊ฐ๋ณ์๋ฅผ SwiftUI์ ๋ ธ์ถ.

- body(content:) ๋ฉ์๋์์ ์ ฐ์ด๋๋ฅผ ์ธ์คํด์คํ ํ๊ณ ์ด๋ฅผ ์ฝํ ์ธ ์ ์ ์ฉ
- ์ ฐ์ด๋์๋ ์๊ฐ ๊ฐ๋ ์ด ์์. SwiftUI์์ ์ ๋๋ฉ์ด์ ์ ์๋์์ผ์ผํจ

- RippleEffect ๋ผ๋ ViewModifier๋ฅผ ์์ฑ
: keyframeAnimator ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ค์ฒ์ ๊ฐ์ด ์ธ๋ถ ๋ณํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ ๋๋ฉ์ด์ ์คํ ๊ฐ๋ฅ
- ํธ๋ฆฌ๊ฑฐ ๊ฐ์ด ์ ๋ฐ์ดํธ ๋ ๋ ๋ง๋ค 0์์ ์ต์ข ์ง์ ์๊ฐ ๊ฐ๊น์ง elapsedTime์ ์ ๋๋ฉ์ด์ ์ ์ฉ
- ์ ๋๋ฉ์ด์ ์ ๋ชจ๋ ๋จ๊ณ์์ ํ์ฌ ์๊ฐ๊ณผ ๋ณด๊ธฐ๋ฅผ ๋๋ฅธ ์๋ ์ง์ ์ RippleModifier์ ์ ๋ฌ.

- ๋๋ฒ๊ทธ UI๋ฅผ ๋น๋.

- ๋๋ฒ๊ทธ UI๋ ๋ณต์กํ ์ ๋๋ฉ์ด์ ์ ๋ฐ๋ณตํ ๋ ์ ์ฉ !!
- ๋งค๊ฐ๋ณ์ ๋ ธ์ถ, ์ค๊ฐ ๊ฐ์ ์๊ฐํํ๋ ์ค๋ฒ๋ ์ด ๊ทธ๋ฆฌ๊ธฐ.
- ํผ๋๋ฐฑ : ์ ์ฉ, ์ ฐ์ด๋ ์์ ์ ๋ฌด๊ถ๋ฌด์ง

์ด๋ฒ ์ธ์ ์์๋ SwiftUI๋ก ์๊ฐํจ๊ณผ๋ฅผ ๋ง๋๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์๋๋ฐ์.
์๊ฐ๋ณด๋ค ์์ด ๋ง๊ณ , ๋ด์ฉ์ด ๊ตฌ์ฒด์ ์ด์๋ค์... ! ์ค์ ๋ก ์ ๊ฐ ์ด๋ ๊ฒ ๊น๊ฒ ์ฌ์ฉํด๋ณผ ์ ์์์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ~
๋ชฌ๊ฐ ์ด๊ฒ์ ๊ฒ ์ ๊ธฐํ ์ธ์ ์ด์์ต๋๋ค :)
๋ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
'iOS > WWDC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| WWDC24) SwiftUI ํต์ฌ ๊ธฐ๋ฅ (2) | 2025.06.15 |
|---|---|
| WWDC25) Xcode์ ์๋ก์ด ๊ธฐ๋ฅ (6) | 2025.06.13 |
| WWDC24) Swift testing์ผ๋ก ํ ์คํธ ์ฌํํ๊ธฐ (0) | 2025.05.25 |
| WWDC24) Swift Testing ์๊ฐ (0) | 2025.05.25 |
| WWDC24) Swift์ ์ฑ๋ฅ ์ดํด๋ณด๊ธฐ (0) | 2025.05.18 |