์ง๊ธ ์งํํ๊ณ ์๋ ํ๋ก์ ํธ์์ ๋์์ธ ์์คํ ์ ๋์ ํ๊ณ ์๋ค.
๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค์ ๋์์ธ์ด ๊ตฌ์์ด ๋์ด ์์ด์, ์ด๋ฅผ ๊ทธ๋๋ก ๊ตฌํํ๋ฉด ๋๋ ์ํฉ์ด์์ง๋ง ProgressView๋ ๋ช ์๋ ๋์์ธ์ด ์์๋ค. ๊ทธ๋์ ์ด๋ป๊ฒ ๊ตฌํํ ์ง ๊ณ ๋ฏผํ๋ค๊ฐ, ์ฑ์ Identity์ UX๋ผ๋ ๋ ๋ง๋ฆฌ์ ํ ๋ผ๋ฅผ ๋ชจ๋ ์ก์๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
์ด๋ฅผ ์ํด, ์ฐ๋ฆฌ ์ฑ์ ๋ก๊ณ ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
ํ์ง๋ง ๋จ์ํ ๋ก๊ณ ๋ง ๋์ด์ฃผ๊ธฐ์ ์ด์์ง๋ ์๊ณ , ์ผ๋จ UX์ ์ผ๋ก ๋ง์์ ๋ค์ง ์์๋ค.
Why? ๐ง
ProgressView๋ ์ด๋ ํ ์์ฒญ(ex, API Request)์ ๋ํ ์๋ต์ ๋ฐ๊ธฐ ์ ๊น์ง์ ๋ก๋ฉ์ ์์์ ์ผ๋ก ํํํ๋ ๊ฒ์ธ๋ฐ, ๋จ์ํ ๋ก๊ณ ๋ง ๋ก ๋์ด๋์ผ๋ฉด ์ฌ์ฉ์๋ ์ด๊ฒ ๋ฌด์จ ์ํฉ์ธ์ง ์ ํ ์ ๋ฐฉ๋ฒ์ด ์๋ค. ๊ทธ๋์ Dynamicํ ์์๊ฐ ํ์ํ๋๋ฐ, ๊ทธ๋ฌ๋ ์ค Shimmer๋ผ๋ ๊ธฐ๋ฒ(?)์ด ๋ ์ฌ๋๋ค.
์์ฃผ ์ฐธ๊ณ ํ๋ SwiftUI ๊ด๋ จ ์ ํ๋ฒ์ธ๋ฐ, ํด๋น ์์์๋ .mask๋ฅผ ํ์ฉํด์ ๋น์ด ์ด๋ํ๋ฉด์ ๋ฐ์ํ๋ ๊ทธ๋ฆผ์ ํจ๊ณผ๋ฅผ ์ฃผ๊ณ ์์๋ค.
์ด์ ๋น์ทํ๊ฒ ๊ตฌํํ๋, ๋ค๋ฅธ ๋๋์ ์ฃผ๊ณ ์ถ์๋ค.
๊ทธ๋ ๊ฒ ๊ตฌํ์ ์์ํ๊ณ , ๊ตฌํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
์ฑ์ ๋ก๊ณ ๋ฅผ ํ์ฉํ์ฌ Identity๋ฅผ ๊ฐ์ ธ๊ฐ๋ฉด์, ๋์์ ์ฌ์ฉ์์๊ฒ ๋ก๋ฉ ์ค์ด๋ผ๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์๊ฒ ๋๋ค.
๊ตฌํ
View
์ฐ์ ์ฒซ ๋ฒ์งธ๋ก Base๊ฐ ๋๋ View์ด๋ค.
ZStack ๋ด๋ถ์ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ ์ฅ ๋ฐฐ์นํ๋ค.
2๋ฒ ์ด๋ฏธ์ง์ ์ปฌ๋ฌ๋ฅผ ์ฑ์์ฃผ๊ณ , .mask modifier๋ฅผ ๋ถ์ฌ์ค๋ค.
์ฐ์ .mask์ ๋ํด ๊ฐ๋จํ๊ฒ ์ค๋ช ํ์๋ฉด, ๊ทธ๋ฅ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ง์คํฌ๋ฅผ ๋ ์ฌ๋ฆฌ๋ฉด ๋๋ค.
์ผ๊ตด์ ๊ฐ๋ฆฌ๋ ๊ฒ์ฒ๋ผ, content๋ฅผ ๊ฐ๋ฆด ์ ์๊ฒ ํด์ฃผ๋ modifier์ด๋ค.
ํ ๋ฒ ์จ๋ณด๋ฉด ๋ฌด์จ ๋๋์ธ์ง ์ ์ ์์ ๊ฒ์ด๋ค.
์ดํด๋ฅผ ๋๊ธฐ ์ํด, ์์ ์์ฑํ ์ฝ๋์์ .mask๋ฅผ ์กฐ๊ธ ์์ ํด๋ดค๋ค.
๋ก๊ณ ์ .mask๊ฐ ์์ด์ ธ์ ์ ์์ ๊ฐ๋ ค์ง ๊ฒ์ ๋ณผ ์ ์๋ค.
(์ฌ์ค .mask๋ฅผ ์ฐ์ง ์์๋, ZStack์ด๋ Overlay๋ก๋ ์ถฉ๋ถํ ๊ตฌํ ๊ฐ๋ฅํ๋ค๋ ์๊ฐ์ด ๋ค๊ธดํ์ง๋ง... ๐ )
์๋ฌดํผ ๋ค์ ๋ณธ๋ก ์ผ๋ก
2๋ฒ ์ด๋ฏธ์ง๋ฅผ ๊ฐ๋ฆด ์ ์๋ Rectangle ํํ์ ๋ง์คํฌ๋ฅผ ์ ์ธํ๋ค.
์ฌ๊ธฐ์ ๋ก๊ณ ๊ฐ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฑ์์ง๋ ๋๋์ ์ฃผ๊ธฐ ์ํด ์ ๋๋ฉ์ด์ ์ ํ์ฉํ๋ค.
์ด๊ธฐ์๋ Rectangle์ ํฌ๊ธฐ๊ฐ 0์ด๊ณ , ์ ๋๋ฉ์ด์ ์ด ์์๋๋ฉด ๋ก๊ณ ์ ๋๋น๊น์ง ์ฆ๊ฐํ๋ค.
offset๋ -(๋ก๊ณ ์ ํฌ๊ธฐ * 0.35)์ด๊ณ , ์ ๋๋ฉ์ด์ ์ด ์์๋๋ฉด 0๊น์ง ์ฆ๊ฐํ๋ค.
์ด๋ ๊ฒ ํด์ฃผ๋ฉด ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ปฌ๋ฌ๊ฐ ์ฑ์์ง๋ ๋๋์ ์ค ์ ์๊ฒ ๋๋ค.
ViewModifier
์์ ๊ตฌํํ ProgressView๋ฅผ ์ฌ์ฉํ ViewModifier์ด๋ค. ProgressView์์๋ ํํ๋ฅผ ์ ์ํ๋ค๋ฉด, ์ด ๊ณณ์์๋ ์ ๋๋ฉ์ด์ ์ ๋ถ์ฌํ๊ณ Background๋ฅผ ์ง์ ํ๋ ์ญํ ์ ์ํํ๋ค.
ZStack์ ํ์ฉํ์ฌ ProgressView๊ฐ ๋ณด์ฌ์ง ๋, Touch Event๋ฅผ ๋ง๊ธฐ ์ํด Background๋ฅผ ์ง์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ onAppear๋ฅผ ํ์ฉํ์ฌ View๊ฐ ๋ณด์ฌ์ง๋ฉด ์ ๋๋ฉ์ด์ ์ ์๋ํ๋๋ก ๊ตฌํํ๋ค.
isPresented์ isAnimated๊ฐ ํท๊ฐ๋ฆด ์ ์๋๋ฐ
isPresented๋ ProgressView๋ฅผ ๋์ฐ๋ ํ๋กํผํฐ,
isAnimated๋ ProgressView ๋ด๋ถ์ ์ ๋๋ฉ์ด์ ์ ์๋ํ๋ ํ๋กํผํฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
Extension
์์ ๊ตฌํํ ViewModifier๋ฅผ Extension์ ํ์ฉํ์ฌ Modifier์ ํํ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๋งตํํ๋ค.
๊ทธ ๊ฒฐ๊ณผ, ์ต์ข ์ ์ผ๋ก๋ View์์ Extension๋ง ํธ์ถํด์ ์ฌ์ฉํ๋ค.
์ด๋ฐ ์์ผ๋ก ProgressView๊ฐ ํ์ํ ๊ณณ์์ modifier์ ํํ๋ก ์ ๊ทผํ๋ค.
isPresented๊ฐ true์ด๋ฉด ProgressView๊ฐ ๋ณด์ฌ์ง๊ณ ,
false์ด๋ฉด ProgressView๊ฐ ์ฌ๋ผ์ง๊ฒ ๋๋ค.
TMI...
์ฝ๋๋์ด ๋ง์ง๋ ์๋ค.
๊ทธ๋๋ ์ฝ๋๋์ ๋นํด ๋ง์ ๊ณ ๋ฏผ์ ํ๋ ์ปดํฌ๋ํธ์๋ค.
๋ํ ์ฌ์ฉํ๋ ๊ณผ์ ์์ ๋ค๋ฅธ ์ ๋๋ฉ์ด์ ์ด๋ ๊ฒน์น๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๋ฐ, ์ต์๋จ View์์ ํธ์ถํ๋ ๊ฒ์ผ๋ก ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.