Background
Problems
๊ธฐ์กด ํ๋ก์ ํธ๋ NavigationView๋ NavigationStack์ด ์๋ค. ํ๋ฉด ์ด๋์ ํ๊ณ ์ ํ ๋๋ ์ด๋ ํ View๋ฅผ ZStack์ ์ฌ์ฉํด์ ๊ธฐ์กด ๋ทฐ ์์ ๋ฎ์ด ์์ฐ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์๋ค. ์ฌ๊ธฐ์ navigation push ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ์ฃผ๊ธฐ ์ํด ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ๋ฐ๊ณ ๋ค์ด์ค๋ ๋ฏํ ์ ๋๋ฉ์ด์ ์ด ๋ค์ด๊ฐ ์๋ค.
๋ฉ์ธ์๋ ํญ๋ทฐ๊ฐ ์กด์ฌํ๊ณ ๊ฐ ํญ์๋ rootView๋ผ๊ณ ํ ์ ์๋ View๊ฐ ์กด์ฌํ๋ค. rootView์์ ์์ธ๋ก ์ด๋ํ๋ฉด ์ด ์์ธ ํ๋ฉด์ ํญ๋ฐ๋ฅผ ๊ฐ๋ฆฌ๋ฉด์ ํ๋ฉด ์ ์ฒด๋ฅผ ์ฐจ์งํด์ผ ํ๋ค.
ํญ๋ทฐ๊ฐ ๋ณด์ด์ง ์์์ผ ํ๋ฏ๋ก window์์ UITabBar์ ์ฐพ๊ณ window ์ ์ฒด offset์ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ์์๋๋ฐ ํญ๋ทฐ๋ฅผ ๊ฐ๋ฆฌ๊ณ ๋ณด์ด๊ฒ ํ๋ ๊ณผ์ ์์ ์ฌ์ด๋ ์ดํํธ๊ฐ ๋ฐ์ํ๋ฉด์ ์ ์ ๊ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ ํฌ๋ฆฌํฐ์ปฌํ ์ด์์ UI ํ์ด์ง ์ด์๊ฐ ๋ฐ์ํ๊ณ ์์๋ค.
tabBar.superview?.frame.origin.y = (tabBar.superview?.frame.origin.y)! + 4.5
ํ๋จ ํญ๋ฐ๋ฅผ ๊ฐ๋ฆฌ๋ ๋ก์ง์ UITabBar๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด์๋๋ฐ ์ด๋ ํจ๊ป ์คํ๋๋ ์ ์ฝ๋๋ก ์ธํด ํฌ๋ฆฌํฐ์ปฌํ ์ด์๊ฐ ๋ฐ์ํ๊ณ ์์๋ค.
์ด ์ฝ๋๊ฐ ์์ผ๋ฉด ๊ธฐ์กด rootView์ ํฌ๊ธฐ๋ก ์ธํด ํญ๋ฐ๋งํผ์ ๊ณต๊ฐ์ ์ฑ์ธ ์ ์๊ณ , ์ด ์ฝ๋๋ฅผ ๋ฅ๋์๋ ์๋จ์ ๋ฏธ์ธํ ํจ๋ฉ์ด ๋ค์ด๊ฐ๊ณ ์์๋ค.(์ค์ ๋ก๋ ํจ๋ฉ์ด ์๋๋ผ ํ๋ฉด์ด 4.5๋งํผ ๋ด๋ ค๊ฐ๋ค๊ณ ๋ณผ ์ ์๋ค.)
์ ์ด๋ ๊ฒ ์์ ๋์ด ์๋์ง ํ์คํ ๋ฆฌ๊ฐ ๋จ์ ์์ง ์์๊ณ ์์ธ ํ๋ฉด์ผ๋ก ๋ค์ด๊ฐ ๋ ํ์ํ dependency๊ฐ ๋ง์์ ์ด๋ฅผ ํ์ ํ ํ์๊ฐ ์์๋ค.
Purpose
UI ๊นจ์ง๋ ์ด์ ์์ , ํ๋ก์ฐ ์ ์ ์งํํ๋๋ก ์์ , ํญ๋ฐ ๋ ธ์ถ/๋น๋ ธ์ถ ์ด์ ์์
Solution
Tools and Skill
- Xcode v 14.3.1
- iOS ์ต์ ์ง์ ๋ฒ์ v 15.0
Implementation
ZStack์ ๊ฒฝ์ฐ Z ์ถ ๋ฐฉํฅ์ผ๋ก View๊ฐ ์์ด๊ฒ ๋๋ค.
ZStack์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ ๊ฒฝ์ฐ๋ ํฌ๊ฒ 3๊ฐ์ง ์ ๋๊ฐ ์๋ค. frame ์์ ์๋ฅผ ์ฌ์ฉํด์ ํฌ๊ธฐ๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ผ๋ก ๊ณ ์ ๋๋ค. ๋ฐ๋ฉด์ ZStack์ frame์ด ์ง์ ๋์ด ์์ง ์๊ณ ์์๋ทฐ๊ฐ ์กด์ฌํ๋ค๋ฉด ๊ทธ ์์๋ทฐ์ ๋ฐ๋ผ ํฌ๊ธฐ๊ฐ ์ง์ ๋๋ค. ๋ง์ฝ ์์ ๋ทฐ๊ฐ ํ๋ฉด์ ๊ฐ๋ ์ฑ์ ์๋จ ํ๋จ์ ์์นํ๊ฒ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ค๊ฐ์ spacer๋ฅผ ์ฌ์ฉํด์ ์์ญ์ ์ ์ฒด ์์ญ์ผ๋ก ๋ง๋ค์ด ์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ๋ทฐ์ ๋ฐ๋ผ ์ง์ ๋ ZStack์์ ๊ฒน์ณ์ง๊ฒ ์์ด๋ ๋ทฐ๋ ๋ถ๋ชจ ๋ทฐ์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ง์ ๋๋ค.
ํญ์ rootView๋ ํญ ์์ญ์ ์ ์ธํ ์์ญ ๋งํผ ์ฑ์์ ธ ์๊ณ ์ด ๋ทฐ์์ ZStack์ ์ฌ์ฉํด SubView๋ฅผ ์๊ฒ ๋๋ฉด SubView์ ์ต๋ ํฌ๊ธฐ๋ ํญ ์์ญ์ ์ ์ธํ๊ณ ์๋ rootView์ ํฌ๊ธฐ๋ฅผ ๋์ง ๋ชปํ๊ฒ ๋๋ค.
๋ฐ๋ฉด ํญ์ ์ง์ ํ๊ณ ์๋ ์์ ๋ทฐ์ ์์ญ์์ SubView๋ฅผ ZStack์ผ๋ก ์์ ์ฃผ๋ฉด ํ๋ฉด ์ ์ฒด ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํญ๋ฐ๋ฅผ ๊ตณ์ด ๊ฐ๋ฆฌ๊ฑฐ๋ ๋ด๋ ค์ฃผ์ง ์์๋ ๋๋ฉฐ ํญ๋ฐ ์์ญ์ ์ฑ์ฐ๊ธฐ ์ํด UITabBar์ ์์ ๋ทฐ ์คํ์ ์ 4.5๋งํผ ์กฐ์ ํด์ ์๊ธด ์ด์๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
subView์ frame์ ํฌ๊ธฐ๋ฅผ ๊ณ ์ ํ๊ณ ์ด๋ฅผ ZStack์๋ก ๊ฐ์ธ๋ฉด ZStack์ ์์ญ์ SubView๋ค์ ์์ญ์ผ๋ก ์ง์ ๋๋ค. ํ๋์ ๊ธฐ๊ธฐ์์ UI๊ฐ ์ ๋๋ก ๋์ํ๋ ๊ฒ์ ํ์ธํ๋ค ํ๋๋ผ๋ ํด์๋๊ฐ ๋ค๋ฅธ ๊ธฐ๊ธฐ์์ ํ์ธํ๋ฉด ๊ณ ์ ๋ SubView ํฌ๊ธฐ์ ์ํด ZStack์ ํ๋ฉด์ ๋์ด๊ฐ๊ฒ ๋๋ค. ๊ธฐ๋ํ๋ ํ๋ฉด ํฌ๊ธฐ(์ฐ ๋ถํ) ์์ SubView์ ์ํด ๋ ์ปค์ง View๊ฐ ZStack์ ์์ด๊ฒ ๋๊ณ ์ดํ SubView์ Spacing์ ์ฌ์ฉํ๋ฉด์ ํ๋จ ๋ถ๋ถ์ด ์๋ฆฌ๊ฒ ๋์๋ค.
Result
Result
ํญ์ rootView๊ฐ ์๋ ํญ๋ฐ๋ฅผ ํฌํจํ๊ณ ์๋ ํญ์ ์์ ๋ทฐ์์ ์ผ๋ฟ์ ๋์ ์ฃผ๋ฏ ์์ธ ํ๋ฉด์ ๋์ ๊ณ ๊ทธ ์ดํ์ ํ๋ฉด์์ ๋ทฐ๊ฐ ๊นจ์ง์ง ์๋๋ก ZStack์ ํฌ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ค. SwiftUI๋ ๋ค์ํ ๊ธฐ๊ธฐ์ ๋์ํ ์ ์๋ UI ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ frame์ ์ง์ ํด ์ฃผ๋ ๋์ ์ ๋์ ์ผ๋ก View๋ฅผ ์กฐ์ ํ ์ ์๋๋ก ๋ณ๊ฒฝํด ์ฃผ์๋ค.
What to apply
NavigationView์ NavigationStack์ ์ ์ฉ ํ๋ฉด ํญ๋ฐ์ ํญ์ ์จ๊ธธ ์ ์๊ณ , ์ ๋๋ฉ์ด์ ์ฝ๋ ์์ด ๋ค๋น๊ฒ์ด์ ์คํ ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ ์ฉํ๋ ๋ฐฉ์์ ์๊ฐํด ๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
Reference
'iOS ๐ > Issue Fixing' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SwiftUI custom TabBar์ More ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ (1) | 2024.01.03 |
---|---|
iOS 15 fullScreenCover(isPresented:) not working (0) | 2023.12.18 |
SwiftUI preview Cannot preview in this file not building-Onone ํด๊ฒฐํ๋ ๋ฒ (0) | 2023.11.28 |
Firebase DT_TOOLCHAIN_DIR cannot be used to evaluate LIBRARY_SEARCH_PATHS (0) | 2023.08.07 |