iOS ๐ŸŽ/Issue Fixing

[์ด์Šˆํ•ด๊ฒฐ] ZStack ์—์„œ ๋งˆ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ 

fram 2023. 9. 20. 14:43

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