๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS/UIKit

[iOS] Autolayout ์„ ์ ์šฉํ•˜๋ฉฐ UI๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฒ•

by Danna 2021. 6. 13.
728x90
728x90

Autolayout ์„ ์ ์šฉํ•˜๋ฉฐ UI๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฒ• - ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋” vs ์ฝ”๋“œ๋กœ ์ž‘์„ฑ


 

iOS ์•ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋ถ€์ŠคํŠธ์ฝ”์Šค ๋ฌด๋ฃŒ ๊ฐ•์˜

www.boostcourse.org

 

1์žฅ์—์„œ ์Œ์•…์žฌ์ƒ ์•ฑ์„ ๋งŒ๋“ค๋ฉด์„œ ์•„๋ž˜์˜ ๋‚ด์šฉ๋“ค์„ ํ•™์Šตํ–ˆ์Šต๋‹ˆ๋‹ค.

 

  • ์—์…‹(Asset) - ์•ฑ ์•„์ด์ฝ˜, ์ด๋ฏธ์ง€ ํŒŒ์ผ, ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ๊ด€๋ฆฌ, ์•ฑ ์‹คํ–‰์‹œ ํŒŒ์ผ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.
  • ์•ฑ ์‹œ๋‹(App thinning)๊ณผ ์•ฑ ์Šฌ๋ผ์ด์‹ฑ(App slicing) - ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค์—์„œ ๋น ๋ฅด๊ฒŒ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ์ˆ  
  • Cocoa Touch, UIKit, Foundation - iOS ์•ฑ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ 
  • Autolayout ์„ ์ ์šฉํ•˜๋ฉฐ UI๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฒ• - ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋” vs ์ฝ”๋“œ๋กœ ์ž‘์„ฑ
  • iOS์˜ View ์ฒด๊ณ„ - ๋ทฐ ๊ณ„์ธต, ๋ทฐ์˜ ์ขŒํ‘œ, ํ”„๋ ˆ์ž„ vs ๋ฐ”์šด๋“œ, ๋ทฐ ๊ณ„์ธต ๋””๋ฒ„๊น… ํˆด
  • ๋””์ž์ธ ํŒจํ„ด๊ณผ MVC ํŒจํ„ด - ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด๊ณผ ์•ฑ๊ฐœ๋ฐœ์—์„œ์˜ MVC ํŒจํ„ด์„ ์ค‘์ ์ ์œผ๋กœ
  • AVAudioPlayer, Timer - ์Œ์•… ํŒŒ์ผ์„ ์žฌ์ƒํ•˜๊ธฐ ์œ„ํ•œ AVAudioPlayer, ์‹œ๊ฐ„์ดˆ๋ฅผ ์žฌ๊ธฐ ์œ„ํ•œ Timer

 

๐Ÿ’ก์˜คํ† ๋ ˆ์ด์•„์›ƒ (Autolayout)

Autolayout ์€ ๋‹ค์–‘ํ•œ ํฌ๊ธฐ์™€ ๋น„์œจ์˜ ๋””๋ฐ”์ด์Šค์—์„œ ์‹œ๊ฐ์ ์œผ๋กœ ๋™์ผํ•œ ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. Autolayout ์€ ๋ทฐ์˜ ์ œ์•ฝ์‚ฌํ•ญ(constraint)์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ทฐ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ๋™์ ์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค. ๋””๋ฐ”์ด์Šค๋งˆ๋‹ค ํฌ๊ธฐ์™€ ๋น„์œจ์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ, ์•ฑ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์™ธ๋ถ€ ๋ณ€๊ฒฝ๊ณผ ๋‚ด๋ถ€ ๋ณ€๊ฒฝ์— ์˜ํ•ด ํฌ๊ธฐ์™€ ๋น„์œจ์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜๋„ ์žˆ๋‹ค. Autolayout ์€ ํ•ด๋‹น ๊ฒฝ์šฐ์—๋„ ๋™์ ์œผ๋กœ ๋ฐ˜์‘ํ•˜๋Š” UI ๋ฅผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค!

 

์™ธ๋ถ€ ๋ณ€๊ฒฝ (External Changes)

์Šˆํผ ๋ทฐ์˜ ํฌ๊ธฐ๋‚˜ ๋ชจ์–‘์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์™ธ๋ถ€ ๋ณ€๊ฒฝ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋””๋ฐ”์ด์Šค๋ฅผ ํšŒ์ „ํ•˜๊ฑฐ๋‚˜, ์•„์ดํŒจ๋“œ์—์„œ ๋ถ„ํ•  ๋ทฐ(Split View), ๋‹ค๋ฅธ ํฌ๊ธฐ์˜ ํด๋ž˜์Šค๋‚˜ ์Šคํฌ๋ฆฐ์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ์Šˆํผ ๋ทฐ๋Š” ์•ฑ์˜ ์ตœ์ƒ๋‹จ ๋ทฐ๋กœ, ๋””๋ฐ”์ด์Šค์˜ ํ™”๋ฉด์— ํ•ด๋‹น ์•ฑ์ด ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ํ™”๋ฉด์„ ๋œปํ•œ๋‹ค.

๋‚ด๋ถ€ ๋ณ€๊ฒฝ (Internal Changes)

์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ทฐ์˜ ํฌ๊ธฐ ๋˜๋Š” ์„ค์ •์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋‚ด๋ถ€ ๋ณ€๊ฒฝ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜, ๊ตญ์ œ๋ฅผ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ๋™์  ํƒ€์ž…์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ์ฝ˜ํ…์ธ ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์ „๊ณผ ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์„ ํ•„์š”๋กœ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

โœ”๏ธŽ Autolayout ์†์„ฑ

Autolayout ์†์„ฑ - [์ถœ์ฒ˜: ์• ํ”Œ ๊ฐ€์ด๋“œ ๋ฌธ์„œ]

Autolayout ์†์„ฑ์€ ์ •๋ ฌ ์‚ฌ๊ฐํ˜•(์ง์‚ฌ๊ฐํ˜•, ์ •์‚ฌ๊ฐํ˜•)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. 

  • Width, Height : ๋„ˆ๋น„, ๋†’์ด
  • Top, Bottom, Leading, Trailing : ์ƒ๋‹จ, ํ•˜๋‹จ, ํ…์ŠคํŠธ ์‹œ์ž‘ ๋ฐฉํ–ฅ(์ขŒ์ธก), ํ…์ŠคํŠธ ๋ ๋ฐฉํ–ฅ(์šฐ์ธก)
  • Center X, Center Y : ์ˆ˜ํ‰ ์ค‘์‹ฌ, ์ˆ˜์ง ์ค‘์‹ฌ
  • Baseline : ํ…์ŠคํŠธ์˜ ํ•˜๋‹จ

 

๐Ÿ‘€ ์•ˆ์ „ ์˜์—ญ (Safe Area) 

Safe Area ๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ์ƒํƒœ๋ฐ”, ๋‚ด๋น„๊ฒŒ์ด์…˜๋ฐ”, ํˆด๋ฐ”, ํƒญ๋ฐ”๋ฅผ ๊ฐ€๋ฆฌ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์˜์—ญ์ด๋‹ค. Safe Area ๋ ˆ์ด์•„์›ƒ ๊ฐ€์ด๋“œ๋Š” UIView ํด๋ž˜์Šค์˜ safeAreaLayoutGuide ์†์„ฑ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, iOS 11๋ถ€ํ„ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

* ์•„์ดํฐX ๋“ฑ ๋…ธ์น˜๊ฐ€ ์กด์žฌํ•˜๋Š” ๋””์Šคํ”Œ๋ ˆ์ด์™€ ๋…ธ์น˜๊ฐ€ ์—†๋Š” ๋””์Šคํ”Œ๋ ˆ์ด์˜ ๊ฒฝ์šฐ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ํ™”๋ฉด์ด ๋‹ค๋ฅด๋‹ค. ์ด๋Ÿฐ ์ ๋“ค์„ ๊ณ ๋ คํ•ด ์ฝ˜ํ…์ธ ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก Safe Area ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค!

* ์•„๋ž˜ ์ด๋ฏธ์ง€์—๋Š” ์ขŒ์šฐ ๋งˆ์ง„์ด ๋‚˜ํƒ€๋‚˜์žˆ์ง€ ์•Š์ง€๋งŒ, ์‹ค์ œ ํ…Œ์ŠคํŠธํ•ด๋ณด๋ฉด SuperView ์™€ SafeArea ๋Š” ์ขŒ์šฐ ์‹œ์ž‘ ์ง€์ ์ด ๋‹ค๋ฅด๋‹ค.

Safe area ๋น„๊ต ์‚ฌ์ง„ [์ถœ์ฒ˜: ์• ํ”Œ ๋ฌธ์„œ - Positioning Content Relative to the Safe Area]

 

โœ”๏ธŽ ์ œ์•ฝ (Constraint)

๋ทฐ ์Šค์Šค๋กœ or ๋ทฐ์™€ ๋ทฐ ์‚ฌ์ด์— ๊ด€๊ณ„๋ฅผ Autolayout ์†์„ฑ์„ ํ†ตํ•ด ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ฝ(Constraint) ๋ผ๊ณ  ํ•œ๋‹ค. Constraint ๋Š” ๋ฐฉ์ •์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์ œ์•ฝ์€ "Red ๋ทฐ์˜ Leading (์ขŒ์ธก) ์ง€์ ์€ Blue ๋ทฐ์˜ Trailing (์šฐ์ธก) ์ง€์ ์˜ 1.0 ๋ฐฐ์— 8.0 ๋งŒํผ ๋”ํ•œ ์œ„์น˜' ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๋ทฐ ์ œ์•ฝ์‚ฌํ•ญ [์ถœ์ฒ˜: ์• ํ”Œ๊ฐ€์ด๋“œ - Anatomy of a Constraint]

 

๐Ÿค” ์ฝ˜ํ…์ธ  ๊ณ ์œ  ์‚ฌ์ด์ฆˆ์™€ ์ œ์•ฝ ์šฐ์„ ๋„

๊ณ ์œ  ์ฝ˜ํ…์ธ  ํฌ๊ธฐ(Intrinsic Content Size)

Intrinsic Content Size ๋ž€ ๋ทฐ์˜ ๊ณ ์œ  ์ฝ˜ํ…์ธ  ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์ ์šฉํ•˜๊ธฐ ์ „ ๋ทฐ๊ฐ€ ๊ฐ–๋Š” ์›๋ž˜์˜ ํฌ๊ธฐ์ด๋‹ค.

 

  • Label ์˜ ๊ณ ์œ  ์ฝ˜ํ…์ธ  ํฌ๊ธฐ = Label ์˜ ํ…์ŠคํŠธ์˜ ํฌ๊ธฐ
  • Image ์˜ ๊ณ ์œ  ์ฝ˜ํ…์ธ  ํฌ๊ธฐ = Image ์ž์ฒด์˜ ํฌ๊ธฐ

 

์ œ์•ฝ ์šฐ์„ ๋„(Constraint Priorities)

ํ•˜๋‚˜์˜ ๋ทฐ์— ์ ์šฉ๋œ ์ œ์•ฝ์ด ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ, ์šฐ์„ ๋„๊ฐ€ ๋†’์€ ์ œ์•ฝ์ด ์šฐ์„ ์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ์— ์ ์šฉ๋˜๊ณ , ์šฐ์„ ๋„๊ฐ€ ๋‚ฎ์€ ์ œ์•ฝ์€ ๋ฌด์‹œ๋œ๋‹ค. 

 

์ฝ˜ํ…์ธ  ํ—ˆ๊น… ์šฐ์„ ๋„ (Content hugging priority)

๊ณ ์œ  ์ฝ˜ํ…์ธ  ํฌ๊ธฐ๋ณด๋‹ค ๋ทฐ๊ฐ€ ์ปค์ง€์ง€ ์•Š๋„๋ก ์ œํ•œํ•œ๋‹ค. ๋‹ค๋ฅธ ์ œ์•ฝ์‚ฌํ•ญ๋ณด๋‹ค ์šฐ์„ ๋„๊ฐ€ ๋†’์œผ๋ฉด ๋ทฐ๊ฐ€ ๊ณ ์œ  ํฌ๊ธฐ๋ณด๋‹ค ์ปค์ง€์ง€ ์•Š๋Š”๋‹ค.

 

์ฝ˜ํ…์ธ  ์ถ•์†Œ ๋ฐฉ์ง€ ์šฐ์„ ๋„ (Content compression resistance priority)

๊ณ ์œ  ์ฝ˜ํ…์ธ  ํฌ๊ธฐ๋ณด๋‹ค ๋ทฐ๊ฐ€ ์ž‘์•„์ง€์ง€ ์•Š๋„๋ก ์ œํ•œํ•œ๋‹ค. ๋‹ค๋ฅธ ์ œ์•ฝ์‚ฌํ•ญ๋ณด๋‹ค ์šฐ์„ ๋„๊ฐ€ ๋†’์œผ๋ฉด ๋ทฐ๊ฐ€ ๊ณ ์œ  ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์•„์ง€์ง€ ์•Š๋Š”๋‹ค.

 

๐Ÿ’ก Autolayout ๊ตฌํ˜„ํ•˜๊ธฐ - ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”(Storyboard)

Autolayout ์€ ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”(Storyboard) ์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

์Šคํ† ๋ฆฌ๋ณด๋“œ๋กœ ๊ตฌํ˜„ํ•  ์‹œ ์ˆœ์„œ

 

  1. ์Šคํ† ๋ฆฌ๋ณด๋“œ์˜ View Controller Scene ์— ๊ฐ์ฒด๋“ค์„ ๋ฐฐ์น˜ํ•œ๋‹ค. (๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ!)
  2. View ๊ฐ์ฒด๋“ค์˜ Constraints ๋ฅผ ์ง€์ •ํ•ด Autolayout ์„ ์ ์šฉํ•œ๋‹ค. 
  3. View ๊ฐ์ฒด๋“ค์˜ ๋™์ ์ธ ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ, View Controller ์— @IBOutlet ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด ์—ฐ๊ฒฐํ•œ๋‹ค.
  4. View ๊ฐ์ฒด๋“ค ์ค‘ ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ๋“ฑ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ, View Controller ์— @IBAction ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•ด ์—ฐ๊ฒฐํ•œ๋‹ค.

 

์Šคํ† ๋ฆฌ๋ณด๋“œ ์‚ฌ์šฉ์‹œ ์žฅ์ 

Scene ๋งˆ๋‹ค View object ๋“ค์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜๊ณ , Autolayout ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ์— ํ™•์ธํ•˜๊ธฐ ์‰ฝ๊ณ , ์ž‘์—… ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

ํ™”๋ฉด ๊ฐ„ ์ „ํ™˜์ธ Segue ๋ฅผ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ , ์Šคํ† ๋ฆฌ ๋ณด๋“œ์—์„œ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด UI ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ค„์ธ๋‹ค.

 

์Šคํ† ๋ฆฌ๋ณด๋“œ ์‚ฌ์šฉ์‹œ ๋‹จ์ 

๊ฐ™์€ ์Šคํ† ๋ฆฌ๋ณด๋“œ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ๊ฒฝ์šฐ ํŒ€ ํ™˜๊ฒฝ์—์„œ ๋ณ‘๋ ฌ๋กœ ์ž‘์—…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. (๊นƒ ์ถฉ๋Œ์ด ๋‚  ์ˆ˜ ์žˆ๋‹ค -> ๊ฐ์ž ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์ˆ˜์ • ์‹œ ํ•ด๊ฒฐ)

์Šคํ† ๋ฆฌ๋ณด๋“œ ํŒŒ์ผ์ด ์ปค์งˆ ๊ฒฝ์šฐ ํŒŒ์ผ์„ ์—ด ๋•Œ ๋Š๋ ค์ง„๋‹ค. (ํŠน์ • ๊ธฐ๋Šฅ์˜ View ๋งˆ๋‹ค ์Šคํ† ๋ฆฌ๋ณด๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค)

๋™์ ์œผ๋กœ UI๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ํž˜๋“ค๋‹ค. (Code ๋กœ ๋ถ„๊ธฐ๋ฅผ ๋‚˜๋ˆ„์–ด ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค) 

 

์Šคํ† ๋ฆฌ๋ณด๋“œ ์˜ˆ์‹œํ™”๋ฉด!

ํฐ์ƒ‰์œผ๋กœ ๊ฐ•์กฐํ•œ ๋ถ€๋ถ„๋“ค์ด ๋ทฐ๋“ค์˜ Constraints ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ๊ฐ ์ œ์•ฝ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” Ctrl + ํด๋ฆญ (์ฒซ๋ฒˆ์งธ์š”์†Œ) -> ๋“œ๋ž˜๊ทธ (๋‘๋ฒˆ์งธ์š”์†Œ) ๋กœ ํ•  ์ˆ˜๋„ ์žˆ๊ณ , Add New Constraint ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ Autolayout ์ง€์ •ํ•˜๊ธฐ

 

๐Ÿ’ก Autolayout ๊ตฌํ˜„ํ•˜๊ธฐ - Code

์ฝ”๋“œ๋กœ Autolayout ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ทฐ์˜ ์•ต์ปค(NSLayoutAnchor)์— ์ œ์•ฝ(NSLayoutConstraint)์„ ๊ฑธ์–ด์ฃผ๋ฉด ๋œ๋‹ค. ์•ต์ปค(Anchor)๋Š” ์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋˜ Autolayout ์†์„ฑ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„ ๋  ๋“ฏ ํ•˜๋‹ค. 

 

Anchor ์™€ ๊ด€๋ จ๋œ properties

 

  • widthAnchor, heightAnchor : ๋ทฐ ํ”„๋ ˆ์ž„์˜ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ ˆ์ด์•„์›ƒ ์•ต์ปค
  • topAnchor, bottomAnchor, leadingAnchor, trailingAnchor : ๋ทฐ ํ”„๋ ˆ์ž„์˜ ์ƒ๋‹จ, ํ•˜๋‹จ, ๋ฆฌ๋”ฉ, ํŠธ๋ ˆ์ผ๋ง์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ ˆ์ด์•„์›ƒ ์•ต์ปค
  • centerXAnchor, centerYAnchor : ๋ทฐ ํ”„๋ ˆ์ž„์˜ ์ˆ˜ํ‰ ์ค‘์‹ฌ๋ถ€, ์ˆ˜์ง ์ค‘์‹ฌ๋ถ€ ๋ ˆ์ด์•„์›ƒ ์•ต์ปค
  • constraints : ๋ทฐ์— ๋ถ€์—ฌํ•œ ์ œ์•ฝ์‚ฌํ•ญ๋“ค์„ ๋‹ด์€ ๋ฐฐ์—ด

 

์ฝ”๋“œ๋กœ Autolayout ๊ตฌํ˜„ํ•˜๋Š” ์ˆœ์„œ

 

  • View ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. (UIButton, UILabel ๋“ฑ์˜ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ)
  • View ๊ฐ์ฒด์— ๋Œ€ํ•ด translatesAutoresizingMaskIntoConstraint ์†์„ฑ์„ false ๋กœ ์„ค์ •ํ•œ๋‹ค. 
  • View ๊ฐ์ฒด์˜ ์•ต์ปค์— ์ œ์•ฝ(constraint)์„ ๊ฑธ์–ด์ค€๋‹ค.
  • ์ƒ์„ฑ๋œ ์ œ์•ฝ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ œ์•ฝ์˜ isActive ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ true ๋กœ ์„ค์ •ํ•œ๋‹ค.
    NSLayoutConstraint.activate([constraint1, constraint2]) ํ˜•ํƒœ๋กœ ํ•œ๋ฒˆ์— ํ™œ์„ฑํ™”๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ•„์š”ํ•œ ๊ฒฝ์šฐ @IBOutlet ๋ณ€์ˆ˜์™€ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜, @IBAction ๋ฉ”์†Œ๋“œ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.
๐Ÿ‘€ translatesAutoresizingMaskIntoConstraint ??
--- ์˜คํ† ๋ ˆ์ด์•„์›ƒ์ด ๋„์ž…๋˜๊ธฐ ์ „ ๋ทฐ๋ฅผ ์œ ์—ฐํ•˜๊ธฐ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ† ๋ฆฌ์‚ฌ์ด์ง• ๋งˆ์Šคํฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์˜คํ† ๋ ˆ์ด์•„์›ƒ ์ ์šฉ์‹œ ๊ธฐ์กด์˜ ์˜คํ† ๋ฆฌ์‚ฌ์ด์ง•๊ณผ ์ถฉ๋Œ์ด ๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์˜คํ† ๋ฆฌ์‚ฌ์ด์ง•์„ false ๋กœ ์ ์šฉ์„ ํ•ด์ œํ•ด์ค€ ํ›„ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 
--- Storyboard ์—์„œ Autolayout ์„ ์ ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ž๋™์œผ๋กœ false ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค.

 

์ฝ”๋“œ๋กœ ์ œ์•ฝ ์กฐ๊ฑด ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

1. NSLayoutConstraint ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์œผ๋กœ ์ œ์•ฝ ์กฐ๊ฑด ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

// button ์„ view ์˜ ์ˆ˜์ง ์ค‘์•™ ์œ„์น˜ * 0.8 ์— ๋ฐฐ์น˜
let centerY: NSLayoutConstraint
centerY = NSLayoutConstraint(item: button, 
	attribute: .centerY, 
    relatedBy: .equal, 
    toItem: self.view, 
    attribute: .centerY, 
    multiplier: 0.8, 
    constant: 0)

 

2. Layout Anchor ์˜ constraint ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ๋œ NSLayoutConstraint ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

let centerX: NSLayoutConstraint // button ์„ view ์˜ ์ˆ˜ํ‰ ์ค‘์•™์— ๋ฐฐ์น˜
centerX = button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor)

 


๋ฆฌ๋ทฐ

๊ธฐ์กด์—๋Š” Storyboard ์œ„์ฃผ๋กœ UI ๊ฐœ๋ฐœ์„ ํ–ˆ์—ˆ๊ธฐ์— Autolayout ์„ ์ฝ”๋“œ๋กœ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •ํ™•ํžˆ ์•Œ์ง€ ๋ชปํ–ˆ๋‹ค. ๋ถ€์ŠคํŠธ์ฝ”์Šค ๊ฐ•์˜๋ฅผ ํ†ตํ•ด ํ™•์‹คํ•˜๊ฒŒ ํ•™์Šตํ•˜๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์—ˆ๋‹ค! ์Šคํ† ๋ฆฌ๋ณด๋“œ / ์ฝ”๋“œ / XIB ์ด์šฉ์€ ์‚ฌ๋ฐ”์‚ฌ, ํšŒ๋ฐ”ํšŒ, ํŒ€๋ฐ”ํŒ€ ์ด๋ผ๊ณ  ๋“ค์—ˆ๊ธฐ์—.. ๋•Œ์— ๋งž๊ฒŒ ์ ์ ˆํ•˜๊ฒŒ ์ „๋ถ€ ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์ง€ ์•Š์„๊นŒ?

 

 

์ฐธ๊ณ  ๋งํฌ

728x90
728x90