ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] Safe Area ์™€ Layout Margins ์ด๋ž€?
    iOS/๐Ÿค– App 2021. 8. 10. 15:47

    ์•ˆ๋…•ํ•˜์„ธ์š”๐Ÿถ

     

    ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” Safe Area ์™€ Layout Margins ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

     

    ์ด์ „๊นŒ์ง€๋Š” ์ •ํ™•ํ•˜๊ฒŒ ๋ชจ๋ฅด๊ณ  ์‚ฌ์šฉํ•˜๋˜ ๊ฐœ๋…๋“ค์„

    ์ด๋ฒˆ ๊ธฐํšŒ์— ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ œ๋Œ€๋กœ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ์˜€๋Š”๋ฐ์š”.

     

    ๋„ˆ๋ฌด ๋ฟŒ๋“ฏํ•œ ๋งˆ์Œ์— ์‹ ๋‚˜๊ฒŒ ๊ธ€์„ ์ ์—ˆ์Šต๋‹ˆ๋‹ค.

     

    ๊ทธ๋Ÿผ ์‹œ์ž‘ํ• ๊ฒŒ์š”~!!!!๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ


     

    Layout Margins ์˜ ๊ฐœ๋…

     

    ๋ทฐ์˜ ์—ญํ•  ์ค‘ ํ•˜๋‚˜๋Š” ์ปจํ…์ธ ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ๋ทฐ ์†์—๋Š” ์ปจํ…์ธ ๊ฐ€ ์žˆ๋Š”๋ฐ์š”.

     

    ์ด ์ปจํ…์ธ ์˜ ์œ„์น˜๋ฅผ Layout Margins ์„ ํ†ตํ•ด์„œ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค๋ฅธ ๋ทฐ์— ์˜ํ•ด ์ปจํ…์ธ ๊ฐ€ ๊ฒน์น˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

     

    Layout Margins ๋Š” ์ปจํ…์ธ ์™€ ๋ทฐ์˜ bounds ์‚ฌ์ด์˜ ์‹œ๊ฐ์ ์ธ ๋ฒ„ํผ์ž…๋‹ˆ๋‹ค.

     

    ๋ฒ„ํผ๋Š” ์‰ฝ๊ฒŒ ์™„์ถฉ์žฌ ์—ญํ• ์„ ํ•˜๋Š” ๊ณต๊ฐ„์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋˜๋Š”๋ฐ์š”.

     

    ํŠน์ง•์€ ๋ทฐ ๋ฐ”๊นฅ์ด ์•„๋‹Œ ์•ˆ์ชฝ์œผ๋กœ ๋„“์–ด์ง€๋Š” ์™„์ถฉ์ง€์—ญ์ด๋ผ๋Š” ๊ฒƒ์ด์—์š”.

     

    ์ด ๋ฒ„ํผ๋ฅผ ํ†ตํ•ด์„œ ๋ทฐ ๋ฐ”๊นฅ์˜ ์ฝ˜ํ…์ธ ์™€ ๊ฒน์น˜๋Š” ์ผ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

     

    ์ฐธ๊ณ ๋กœ ์›น ๋ถ„์•ผ์—์„œ ํŒจ๋”ฉ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋ถ€๋ถ„๊ณผ ์œ ์‚ฌํ•˜๋‹ต๋‹ˆ๋‹ค~!

     

    ์ฃผํ™ฉ์ƒ‰ ๋ถ€๋ถ„์ด ํŒจ๋”ฉ ์˜์—ญ

     

     

     

    Layout margin ์€ ๊ฐ๊ฐ์˜ ๋ชจ์„œ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” inset ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

     

    ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด 4๊ฐœ ( top, bottom, leading, trailing ) ์˜ inset ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ,

     

    ์—ฌ๊ธฐ์„œ Inset ๊ฐ’์€ ๊ฐ ๋ชจ์„œ๋ฆฌ์—์„œ ๋ทฐ์˜ ์ค‘์‹ฌ ๋ฐฉํ–ฅ์œผ๋กœ ํ–ฅํ•˜๋Š” ์ •๋„๋ผ๊ณ  ์ดํ•ดํ•˜์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

     

    ๋‹ค์Œ ๊ทธ๋ฆผ์€ ์œ„ ๋‚ด์šฉ์„ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ œ๊ฐ€ ์ง์ ‘ ๊ทธ๋ฆฐ ๊ทธ๋ฆผ

     


     

    ์ฝ”๋“œ๋กœ ์ ‘๊ทผํ•˜๋Š” Layout Margins

     

     

    ์ฝ”๋“œ์—์„œ๋Š” layoutMargins ์†์„ฑ์œผ๋กœ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜, ์ƒˆ๋กœ ์„ค์ •ํ•ด ์ค„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    UIEdgeInsets ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋„ฃ์–ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ,

    ์œ„ ๊ทธ๋ฆผ์„ ์ดํ•ดํ–ˆํ•˜๋ฉด ์–ด๋–ค ๋ ˆ์ด์•„์›ƒ ๋งˆ์ง„์ด ๊ทธ๋ ค์งˆ์ง€ ๋ฐ”๋กœ ์ดํ•ด๊ฐ€ ๊ฐ€๋Š” ๋ถ€๋ถ„์ด์ฃ ?

     

     

     

    ์ด๋ ‡๊ฒŒ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ค์‹œ ๋„ฃ์–ด์ฃผ๋ฉด ๋ ˆ์ด์•„์›ƒ ๋งˆ์ง„์ด ์ƒˆ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

     

     

    ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์„œ์—์„œ๋Š” leading, trailing ์ธ๋ฐ

    ์™œ ๋ฐ”๋กœ ์œ„ ์‚ฌ์ง„์—์„œ๋Š”  left, right ๋ผ๋Š” argument label ์„ ๊ฐ€์ง€๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์ œ๊ณต๋˜์—ˆ์„๊นŒ์š”.....?

     

     


     

     

    ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๋ฌธ์„œ์— ์ด๋Ÿฐ ์†์„ฑ๋„ ์žˆ๋„ค์š”...ใ…Žใ…Žใ…Žใ…Ž

    iOS 11 ๋ถ€ํ„ฐ๋Š” directionalLayoutMargins ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

    leading, trailing ์€ ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์ฝ๋Š” ๋ฌธํ™”๊ถŒ์„ ๊ณ ๋ คํ•ด์„œ ๊ณ ์•ˆ๋œ ๋ฐฉํ–ฅ ๊ฐœ๋…์ด์ฃ ??

     

     

    ๋ทฐ, ํŠนํžˆ VC์˜ ๋ฃจํŠธ๋ทฐ์ธ ์ปจํ…ํŠธ ๋ทฐ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์–ด๋–ค ๋งˆ์ง„ ๊ฐ’์ด ๋“ค์–ด์žˆ์„๊นŒ์š”?????????

    ์ด๊ฑด ์•„๋ž˜ Safe Area ๋ถ€๋ถ„์—์„œ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


     

     

    Interface Builder ์—์„œ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š” Layout Margins

    ๋ณธ๋ก ์œผ๋กœ ๋Œ์•„์™€์„œ

    Layout margins ์€ 'margins' ๋ผ๋Š” ๋‹จ์–ด๋กœ Interface Builder ์—์„œ๋„ ๋งŒ๋‚˜๋ณผ์ˆ˜ ์žˆ๋Š”๋ฐ์š”

     

    Constrain to margins

     

     

    ์œ„์ฒ˜๋Ÿผ Constrain to margins ์˜ต์…˜์„ ์ฒดํฌํ•œ๋‹ค๋ฉด,

     

    ์ œ์•ฝ์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ๋ทฐ์˜ bounds ๊ฐ€ ์•„๋‹ˆ๋ผ

     

    ๋ทฐ์˜ margin ์„ ๊ธฐ์ค€์œผ๋กœ ์ œ์•ฝ์„ ์žก๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

     

    ์ง์ ‘ ํ•œ๋ฒˆ ํ•ด๋ณผ๊นŒ์š”???

     

    <๊ธฐ๋ณธ ์กฐ๊ฑด>

    ์˜ค๋ Œ์ง€ ๋ทฐ์— directionalLayoutMargins ์˜

    leading, top, bottom, trailing ๊ฐ’์„ ๊ฐ๊ฐ 50์”ฉ ๋ถ€์—ฌํ•ด์คฌ์–ด์š”!

     

    ์ด์ œ ์˜ค๋ Œ์ง€๋ทฐ์˜ ํ•˜์œ„๋ทฐ๋กœ ํผํ”Œ๋ทฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์žก์•„์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

     

     

    < Constaint to margins ์ฒดํฌ๋ฅผ ํ•ด์ œ >

    < Constaint to margins ์ฒดํฌ>

     

    ์ด๋ ‡๊ฒŒ ์šฐ๋ฆฌ๋Š” ์ง์ ‘ ๋ทฐ์— Layout Margins ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!!

     

     

    ๋‹จ, ๋”ฑ ํ•œ๊ฐ€์ง€ ๊ฒฝ์šฐ!!!!!!!! ์˜ˆ์™ธ๊ฐ€ ์žˆ๋Š”๋ฐ์š”.

     

    ๋ฐ”๋กœ View Controller ์˜ root view ์ž…๋‹ˆ๋‹ค.

    UIKit ์€ root view ๊ฐ€ ์ง€์ผœ์•ผํ•˜๋Š” ์ตœ์†Œํ•œ์˜ layout margins ๊ฐ’์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.

    ~ ๋งˆ์ง„ ๊ฐ’์„ ์ตœ์†Œํ•œ ์ด๋งŒํผ์€ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค~ ๋ผ๋Š” ์˜๋ฏธ

     

    ์ปจํ…์ธ ๋ฅผ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ณ  ์ œ๋Œ€๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์ธ๋ฐ์š”.

     

    ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ์ž„์˜๋กœ root view ์˜ ๋งˆ์ง„์„ (0,0,0,0) ์œผ๋กœ ์„ค์ •ํ–ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„,

    ์ด๊ฒƒ์ด UIKit์ด ์ •ํ•ด ๋†“์€ ์ตœ์†Œ๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋ฉด, ์ด ๊ฐ’์„ ๋ฌด์‹œํ•˜๊ณ  ์ตœ์†Œ๊ฐ’์œผ๋กœ ๋Œ€์ฒด์‹œ์ผœ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค....

     

    ๊ทธ๋Ÿฐ๋ฐ ๋ฌด์Šจ ์ด์œ  ๋•Œ๋ฌธ์— UIKit ์ด ๋ฃจํŠธ๋ทฐ์˜ ์˜ ๋งˆ์ง„ ๊ฐ’์„ (0,0,0,0) ๋ณด๋‹ค ํฐ ๊ฐ’์œผ๋กœ ์ตœ์†Œ ๊ฐ’์„ ์ •ํ•ด๋†“์€ ๊ฒƒ์ผ๊นŒ์š”???

     

    ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด์–ด์„œ ๋งํ•  Safe Area ์™€ ๊ด€๋ จ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.


     

    Safe Area ์˜ ๊ฐœ๋…

     

    SafeArea ๋Š” ํ•ธ๋“œํฐ์˜ ์ „์ฒด์ ์ธ UI๋ฅผ ํ†ตํ‹€์–ด์„œ ์ปจํ…์ธ ๊ฐ€ ์ œ๋Œ€๋กœ ๋ณด์ผ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์—๋งŒ

    ์šฐ๋ฆฌ ๋ทฐ๋ฅผ ๋†“์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์—์š”.

     

     

    ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋„ค๋น„๊ฒŒ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์šฐ๋ฆฌ์˜ ๋ทฐ ์œ„์— ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๋ฅผ ๋„์›Œ์ฃผ๋Š”๋ฐ์š”.

    ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ๋ฐ‘์˜ ๋ถ€๋ถ„์€ ๊ฐ€๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    SafeArea ๋Š” ์ด๋Ÿฐ ๋ทฐ๋“ค์„ ๋ฐ˜์˜ํ•ด์„œ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

     

    ์œ„ ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•ด์„œ ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด

    ํ•˜๋Š˜์ƒ‰์œผ๋กœ ํ‘œํ˜„๋œ ์‚ฌ๊ฐํ˜•์ด Safe Area ์— ํ•ด๋‹นํ•˜๋Š” ์˜์—ญ์ž„์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Status bar ์™€ ๋„ค๋น„๊ฒŒ์ด์…˜๋ฐ”, ํˆด๋ฐ”, Home Indicator ์˜์—ญ์„ ์ œ์™ธํ•œ ๋ถ€๋ถ„์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ฃ ?

     

     

     


     

    Interface Builder ์—์„œ ๋งŒ๋‚˜๋ณด๋Š” Safe Area

    ์šฐ๋ฆฌ๋Š” ์ด ๊ฐ’์„ Interface Builder ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์ฝ”๋“œ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š”๋ฐ์š”.

     

    ์šฐ์„  Interface Builder ์—์„œ ๋ณด๋ฉด 

    Safe Area ์„ ๊ธฐ์ค€์œผ๋กœ ์ œ์•ฝ์„ ๊ฑธ์–ด์ฃผ์–ด์„œ

    ๋‚ด ๋ทฐ๊ฐ€ ์ œ๋Œ€๋กœ ํ‘œํ˜„๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”.

     

    ์ œ์•ฝ์„ ๊ฑฐ๋Š” ๋ฐฉ๋ฒ•์€ ์ด ๊ธ€์˜ ์ฃผ์ œ์™€ ์กฐ๊ธˆ ๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ์–ด์„œ ์‚ฌ์ง„์œผ๋กœ๋งŒ ๋„˜์–ด๊ฐˆ๊ฒŒ์š”!

     


     

     

    Code ์—์„œ ๋งŒ๋‚˜๋ณด๋Š” Safe Area

     

    ์ฝ”๋“œ์—์„œ๋Š” UIView์˜ ์ธ์Šคํ„ด์Šค ์†์„ฑ์ธ  safeLayoutGuide ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

    Safe Area ๊ฐ€ ๊ธฐ์กด ๋ทฐ์— ์–ผ๋งˆ ๋งŒํผ์˜ ๊ฐ’์„ ํŒจ๋”ฉ์œผ๋กœ ์ฃผ์—ˆ๋Š”์ง€๋Š” 

    safeAreaInsets ์†์„ฑ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

     

    ๊ทธ๋Ÿฐ๋ฐ!!!!!

    ์œ„์ชฝ์˜ Layout Margins ์˜ ๋‚ด์šฉ ์ค‘์—์„œ

     

    UIKit ์€ ViewController ์˜ Root View ์— ์ตœ์†Œ ๋งˆ์ง„๊ฐ’ ์„ ์„ค์ •ํ•ด ๋†“๋Š”๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ๋Š”๋ฐ์š”.

    ์—ฌ๊ธฐ์„œ ์ตœ์†Œ ๋งˆ์ง„๊ฐ’์ด๋ž€, "๋งˆ์ง„ ๊ฐ’์ด ์ตœ์†Œํ•œ ์ด ๊ฐ’๋ณด๋‹ค๋Š” ์ปค์•ผ๋ผ" ๋ผ๋Š” ์˜๋ฏธ

     

    ๊ทธ ๋ชฉ์ ๋„ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ์–ด์š”.

    ( ๋ฃจํŠธ ๋ทฐ์˜ ์ปจํ…์ธ ๊ฐ€ ๊ฐ€๋ ค์ง€์ง€ ์•Š๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณด์žฅ)

     

    ์ด ์ตœ์†Œ ๋งˆ์ง„๊ฐ’์ด ์ ์šฉ๋œ ์‚ฌ๊ฐํ˜• ์˜์—ญ์ด Safe Area ์˜ ์˜์—ญ๊ณผ ์ •ํ™•ํ•˜๊ฒŒ ์ผ์น˜ํ•ด์š”.

     

    ์ฆ‰, ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ๋ทฐ๊ฐ€ ๋‚˜์˜ค๋ฉด UIKit ์ด ์ด๋ฅผ ๊ณ ๋ คํ•ด์„œ ์ตœ์†Œ ๋งˆ์ง„๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ !

    ๊ทธ๋ž˜์„œ, ์ด ์ตœ์†Œ ๋งˆ์ง„๊ฐ’ = safeAreaInsets ์ž…๋‹ˆ๋‹ค.

     

    ์˜ˆ์ „์—๋Š” systemMinimum ์–ด์ฉŒ๊ตฌํ•˜๋Š” ์†์„ฑ์„ ์ผ๋˜๊ฒƒ ๊ฐ™์•„์š”.

    ์ง€๊ธˆ์€ ์ ‘๊ทผ์ด ์•ˆ๋˜๋”๋ผ๊ตฌ์š”๐Ÿ› 

    ์ตœ์†Œ ๋งˆ์ง„๊ฐ’๋ณด๋‹ค ์ž‘์œผ๋ฉด UIKit ์— ์˜ํ•ด ๋ฌด์‹œ๋œ๋‹ค

     

     

    ๊ทธ๋Ÿฐ๋ฐ ์•ฝ๊ฐ„ ์ด์ƒํ•˜์ง€ ์•Š๋‚˜์š”?

    ์ €๋Š” ์™œ ์ด ๊ฐ’์„ viewDidLoad ๊ฐ€ ์•„๋‹ˆ๋ผ viewDidAppear ์—์„œ ํ™•์ธํ–ˆ์„๊นŒ์š”????

     

    ๋ฐ”๋กœ SafeLayout ๋ฌธ์„œ์˜ ์ด ๋ถ€๋ถ„ ๋•Œ๋ฌธ์ธ๋ฐ์š”!!!

    If the view is not currently installed in a view hierarchy, or is not yet visible onscreen, the layout guide edges are equal to the edges of the view.

    ๋ทฐ๊ฐ€ ๋ทฐ๊ณ„์ธต์— ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ์•„์ง ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š์„๋•Œ๋Š”

    ์•„์ง Safe Layout Guide ๊ฐ€ ์ ์šฉ๋˜๊ธฐ ์ „ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

    ( ์ด ์‹œ์ ์—๋Š” Guide ๊ฐ€ ์›๋ณธ ๋ทฐ์˜ edge ์™€ ์ผ์น˜ )

     

    ์ฆ‰, ViewDidLoad ํ˜ธ์ถœ ์‹œ์ ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋ทฐ ๊ณ„์ธต์„ ๋กœ๋”ฉํ•œ ์ƒํƒœ์ด์ง€๋งŒ,

    ํ™”๋ฉด์—๋Š” ์•„์ง ๋ณด์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Safe Layout Guide ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ธ๊ฑฐ์ฃ .

    ํ™•์‹คํžˆ ํ•˜๊ณ  ์‹ถ์–ด์„œ ๋กœ๊ทธ๋„ ์ฐ์–ด๋ดค์–ด์š”.

    (๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด  safeLayoutInsets ๊ฐ’ ๋ฅผ ํ”„๋ฆฐํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.)

     

    viewDidAppear(_:) ๋ถ€ํ„ฐ ์ฐํžˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

     

     

     

     

     

    ๊ฒฐ๋ก ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ด์ œ ์•„๋ž˜ ๊ทธ๋ฆผ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

     

     

     

     

    ์—ฌ๊ธฐ์„œ safeAreaLayoutGuide ๋Š” UIView ์˜ ์ธ์Šคํ„ด์Šค ์†์„ฑ์œผ๋กœ์„œ ๋ชจ๋“  ๋ทฐ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”.

     

    ์‹ค์ œ ์˜๋ฏธ ์žˆ๋Š” ๊ฐ’์€ ๋ฃจํŠธ ๋ทฐ์—๋งŒ ๋‹ด๊ฒจ์ ธ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

    safeAreaInsets ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

    ๋ฃจํŠธ ๋ทฐ์˜ Safe Area ์˜์—ญ์ด ์ปจํ…์ธ  ๋ณด์žฅ์ด ๋œ๋‹ค๋ฉด, ๋‹น์—ฐํžˆ ๊ทธ ํ•˜์œ„ ๋ทฐ๋“ค์€ ๋ฃจํŠธ ๋ทฐ์˜ Bounds ๋ฅผ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”ํ•œ

    ๋ฌด์กฐ๊ฑด ์ปจํ…์ธ ๊ฐ€ ์ œ๋Œ€๋กœ ๋ณด์—ฌ์งˆ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.


     

    ์ด ๊ธ€์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ๋ถ€๋ถ„

    ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ ๋‹ด์ง€ ์•Š์•˜์ง€๋งŒ, ์ฐพ์•„๋ณผ ์ˆ˜์žˆ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์ œ์‹œํ•ด๋“œ๋ฆฌ๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

     

    1. Safe Area ์— ์ฝ”๋“œ๋กœ ์ œ์•ฝ์„ ์žก์•„์ฃผ๊ธฐ

    ์ด ๋ถ€๋ถ„์€ NSLayoutAnchor ์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    safeAreaLayoutGuide ๊ฐ€ Anchor ๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ์š”.

     

    ๊ฐ„๋‹จํ•˜๊ฒŒ ์—ฃ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์„ ์ด๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ ์ดํ•ดํ•˜๋ฉด ์ ‘๊ทผํ•˜๊ธฐ ์‰ฝ๋”๋ผ๊ตฌ์š”!

     

    2. SafeArea ์˜์—ญ ์ถ”๊ฐ€๋กœ ๋„“ํžˆ๊ธฐ

    ์‚ฌ์šฉ์ž ์ž„์˜๋กœ ์˜์—ญ์„ ์ถ”๊ฐ€ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋ณดํ†ต ํ™”๋ฉด์„ ๋ฎ๋Š” ์ปค์Šคํ…€ ๋ทฐ๋ฅผ ๋”ฐ๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ํ•„์š”ํ•˜๊ฒ ์ฃ !

    additionalSafeAreaInsets ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

     

    ๊ด€๋ จ ๋‚ด์šฉ์€ ๋งํฌ ํ™•์ธํ•ด ์ฃผ์„ธ์š”!


     

    ์—ฌ๊ธฐ๊นŒ์ง€ ์šฐ์„  ์ œ๊ฐ€ ์ ๊ณ  ์‹ถ์€ ๊ฒƒ์€ ๋‹ค ์ ์€ ๊ฒƒ ๊ฐ™๊ณ , ์ถ”๊ฐ€ํ•  ๋‚ด์šฉ์ด ์ƒ๊ธฐ๋ฉด ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค~!!!

     

    ์ด์ œ ์Šคํฌ๋กค๋ทฐ์˜ contentOffset ๊ณผ contentInset ์— ๋Œ€ํ•œ ๊ธ€์„ ์ ์–ด์•ผํ•˜๋Š”๋ฐ,

    ์ €๋„ 100% ์ดํ•ดํ•œ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‰ฝ์ง€ ์•Š๋„ค์š”....

    ํ•˜์ง€๋งŒ ์Šคํฌ๋กค ๋ทฐ๋Š” ์ •๋ง์ •๋ง ํ•„์š”ํ•œ UI ์ปดํฌ๋„ŒํŠธ์ด๋‹ˆ ๊ณง ๋๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ๊ฐ™์•„์š”.

     

    ๊ทธ๋Ÿผ ๋‹ค์Œ์— ๋ดด๊ฒŒ์š”~!!!

     

     

     

    ๋!


    ๐Ÿค–๐ŸŸข[์šฐ์งฑ์˜ iOS ๋ธ”๋กœ๊ทธ]๐Ÿ”ต๐Ÿ’ป

    iOS๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๊ธฐ๋กํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ฐธ๊ณ ์ž๋ฃŒ 1: https://developer.apple.com/documentation/uikit/uiview/positioning_content_within_layout_margins

    ์ฐธ๊ณ ์ž๋ฃŒ 2: https://developer.apple.com/documentation/uikit/uiview/positioning_content_relative_to_the_safe_area/

    ๋Œ“๊ธ€

์–ด์ œ๋ณด๋‹ค ๋ฐœ์ „ํ•œ ๋‚˜