์ƒˆ์†Œ์‹

๐Ÿ“ฑ iOS/-- UIKit

(iOS) - AutoLayout ,Constraint, intrinsic size

  • -

Auto Layout

์ •์˜

iPhone 4 ๋ถ€ํ„ฐ iPhone 11, iPhone SE, iPhone XS ๊ทธ๋ฆฌ๊ณ  iPhone XS MAX ๋“ฑ ๋ชจ๋‘ ํฌ๊ธฐ๋‚˜ ๋น„์œจ์ด ์ œ๊ฐ๊ฐ์ธ ๋””๋ฐ”์ด์Šค๋“ค์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋””๋ฐ”์ด์Šค ์‚ฌ์ด์ฆˆ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ๋™์ผํ•œ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด ๋‚˜์˜จ ๊ฒƒ์ด ์˜คํ† ๋ ˆ์ด์•„์›ƒ(Auto Layout) ์ธ๋ฐ,  ์ œ์•ฝ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ ˆ์ด์•„์›ƒ ์‹œ์Šคํ…œ์ด ๋””๋ฐ”์ด์Šค ๊ทธ๋ฆฌ๊ณ  ํ•ด์ƒ๋„๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ตœ์ข… ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋ฐฐ์น˜์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฆ‰ , View๋“ค๊ณผ์˜ ๊ด€๊ณ„(์ œ์•ฝ)๋ฅผ ์ด์šฉํ•˜์—ฌ View์˜ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ฒฐ์ •ํ•ด์ฃผ๋Š” ์‹œ์Šคํ…œ์ด๋‹ค.

์˜คํ† ๋ ˆ์ด์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์—๋Š” ๋””๋ฐ”์ด์Šค์˜ ๋‹ค์–‘์„ฑ ์ด์™ธ์—๋„ ๋‘๊ฐ€์ง€ ์š”์ธ์ด ์กด์žฌํ•œ๋‹ค.

์™ธ๋ถ€ ๋ณ€๊ฒฝ

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

๋‚ด๋ถ€ ๋ณ€๊ฒฝ

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

 

Auto Layout ์ด์ „์— ์“ฐ์ด๋˜ Frame-based Layout์—์„œ๋Š” UIView.frame.size.width ์™€ ๊ฐ™์ด frame์— ์ ‘๊ทผํ•˜์—ฌ ์†์„ฑ์„ ๋‹ค๋ค„์•ผํ•œ๋‹ค.

์™ผ์ชฝ ๊ทธ๋ฆผ์€ ์˜ˆ์ „์— ์‚ฌ์šฉํ•˜๋˜ ๋ฐฉ์‹์ธ Frame-based Layout์ด๋‹ค.View๋ฅผ ๋ฐฐ์น˜ํ•  ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๊ณ , View์˜ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ 100ํฌ์ธํŠธ๋กœ ์ง€์ •ํ•ด์•ผํ•œ๋‹ค.

๋ฐ˜๋ช… Auto layout์—์„œ๋Š” ์™ผ์ชฝ, ์ƒ๋‹จ ์—ฌ๋ฐฑ์„ 50ํฌ์ธํŠธ๋กœ ์ง€์ •ํ•˜๊ณ , ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ 100์œผ๋กœ ๊ณ ์ •ํ•˜๋Š” ์ œ์•ฝ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

์–ผํ•๋ณด๋ฉด ๋น„์Šทํ•˜์ง€๋งŒ, ํฐ ์ฐจ์ด์ ์ด ์กด์žฌํ•œ๋‹ค???

์˜คํ†  ๋ ˆ์ด์•„์›ƒ์€ ์ œ์•ฝ์„ ๊ธฐ๋ฐ˜์œผ๋กœ view๋ฅผ ๋ฐฐ์น˜ํ•˜๋ฏ€๋กœ, ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ค.

 

 

Auto Layout Interface Builder

 

Prototype Constraint

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

PreView

Option + Command + enter

runningํ•˜์ง€ ์•Š๊ณ , ํ•œ๋ฒˆ์— ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค์—์„œ์˜ ์ œ์•ฝ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Constarints ๊ณต์‹

AutoLayout์€ ์„ ํ˜• ๋ฐฉ์ •์‹์— ์˜ํ•ด ๊ณ„์‚ฐ์ด ๋œ๋‹ค. ๋‹ค๋ฅธ View๋“ค๊ณผ์˜ ๊ด€๊ณ„(์ œ์•ฝ)์„ ํ†ตํ•ด View์˜ ์œ„์น˜๋ฅผ ๊ฒฐ์ •์ง“๋Š” ์‹œ์Šคํ…œ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋„ค๋ชจ๋‚œ ๋ฐ•์Šค(uiView๋กœ ๋งŒ๋“ฌ)๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ , ์˜ˆ๋ฅผ๋“ค๋ฉด

  • redBox.top = 1.0 * SafeArea.top + 100
    • redBox์˜ top์€ safeArea์˜ top๊ณผ 100์˜ ๊ฑฐ๋ฆฌ์— ์žˆ๋‹ค.
  • redBox.leading = 1.0 * SafeArea.leading + 50
    • redBox์˜ leading์€ safeArea์˜ leading๊ณผ 50์— ์žˆ๋‹ค.
  • ์ œ์•ฝ์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ๋˜๋ฉด ๊ฐ€์žฅ ์ธ์ ‘ํ•œ ๊ณตํ†ต๋ทฐ์— ์ถ”๊ฐ€๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ๊ฒฝ์šฐ์—๋Š” ๊ฐ€์žฅ ์ธ์ ‘ํ•œ ๊ณตํ†ต๋ทฐ๋Š” rootView์ด๋ฏ€๋กœ rootView์— ์ถ”๊ฐ€๋œ๋‹ค.

Realation

=๊ฐ€ ์•„๋‹Œ <=, >=๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฐ€์žฅ ์‰ฌ์šด ์˜ˆ๋ฅผ ๋“ค๋ฉด, Label์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ํ…์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ๊ธด ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

redBox์™€ Label ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋“ฑํ˜ธ๋กœ ๋†“์•˜์„๋•Œ๋Š” ํ…์ŠคํŠธ๊ฐ€ ๊ธธ์–ด์„œ ์ž˜๋ฆฌ์ง€๋งŒ, <=๋ฅผ ํ†ตํ•ด ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ๊ฐ€๊นŒ์›Œ์ ธ๋„ ๋˜๋„๋ก ์„ค์ •ํ•ด๋†“์œผ๋ฉด ํ…์ŠคํŠธ์— ๋งž์ถฐ Label์ด ์ด๋™ํ•œ๋‹ค.

 

 

Priority

1 ~ 1000์˜ ๊ฐ’์ด๋‹ค. ์ค‘๋ณต๋˜๋Š” constraint๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—, ์–ด๋–ค ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌํ• ์ง€๋ฅผ ์šฐ์„ ์ˆœ์œ„๋กœ ์ง€์ •ํ•˜๋Š”๊ฒƒ์ด๋‹ค.

1000 = ํ•„์ˆ˜์ œ์•ฝ์ด๊ณ , ๋” ๋‚ฎ์œผ๋ฉด ์˜ต์…˜์ œ์•ฝ์ด๋‹ค. ์• ๋งคํ•œ ๊ฐ’๋ณด๋‹ค๋Š” ๋„“์€ ๋ฒ”์œ„๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.

ex ) ํ•„์ˆ˜(1000) , ๋†’์Œ(750), ์ค‘๊ฐ„(500), ๋‚ฎ์Œ(250)

์„œ๋กœ ์ถฉ๋Œํ•˜๊ณ , ์šฐ์„ ์ˆœ์œ„๋„ ๊ฐ™๋‹ค๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ๋œ๋‹ค.

์šฐ์„ ์ˆœ์œ„๋ฅผ 999๋กœ ๋†“์œผ๋ฉด, Document Outline ์—์„œ๋Š” @999 ๋กœ ํ‘œ์‹œ๋œ๋‹ค.

 

 

์ฝ”๋“œ๋กœ Priority ๋ฐ”๊พธ๊ธฐ

class ViewController: UIVIewController{
    @IBOutlet weak var reboxHeight: NSLayoutConstraint!

  override func viewDidLoad() {
    super.viewDidLoad()
    if redboxHeight.priority.rawValue == 1000{
      // ๊ฐ’์„ ํ™•์ธํ• ๋•Œ๋Š” rawValue ์†์„ฑ ์ด์šฉ
    redboxHeight.priority = UILayoutPriority(999)
    }
}
}

 

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

๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด AutoLayout์€ constarint๋ฅผ ํ™•์ธํ• ๋•Œ, width ์™€ Height์„ ๋จผ์ € ํ™•์ธํ•œ๋‹ค. ์ด๋•Œ Width, Height์— ๋Œ€ํ•œ ์ œ์•ฝ์ด ์—†๋‹ค๋ฉด ์ฒซ๋ฒˆ์งธ๋กœ ๋‚˜๋จธ์ง€ ์ œ์•ฝ๋“ค๋กœ size๋ฅผ ์ถ”๋ก ํ• ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

๊ทธ๋ž˜๋„ size๋ฅผ ์ถ”๋ก ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด,View๊ฐ€ ์ถœ๋ ฅํ•˜๋ ค๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.์ด๊ฒƒ์ด Intrinsic Content Size์ด๋‹ค. ์ ๋‹นํ•œ ํฌ๊ธฐ๋ฅผ ์–ป๋Š”๋‹ค๋ฉด ์ถœ๋ ฅํ•˜๊ณ , ์•„๋‹ˆ๋ผ๋ฉด ์ œ์•ฝ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

Intrinsic Content Size๋ฅผ ํ—ˆ์šฉํ•˜๋Š” View๋“ค

  • UILabel : ํ…์ŠคํŠธ์™€ ํฐํŠธ, ์‚ฌ์ด์ฆˆ๋ฅผ ํ†ตํ•ด Intrinsic size๋ฅผ ๊ตฌํ•œ๋‹ค. ๋ ˆ์ด๋ธ”์€ ์˜คํžˆ๋ ค width, height์„ ๊ณ ์ •ํ•˜๋Š”๊ฒƒ์ด ํ”ผํ•ด์•ผํ•  ํŒจํ„ด์ค‘์— ํ•˜๋‚˜์ด๋‹ค.
  • UIButton : ๋ฒ„ํŠผ๋„ Label๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค. ์ฐจ์ด์ ์€ ํ„ฐ์น˜๊ฐ์ง€๋ฅผ ์œ„ํ•ด Label๋ณด๋‹ค๋Š” ์•ฝ๊ฐ„์˜ ํŒจ๋”ฉ์ด ๋ถ™์—ฌ์ ธ Intrinsic size๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • UISwitch : ํ•ญ์ƒ ๊ณ ์ •๋œ ํฌ๊ธฐ๋กœ ํ‘œ์‹œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ Intrinsic size๋กœ ์ถœ๋ ฅ๋œ๋‹ค.
  • UITextField: ํ•ญ์ƒ ์ž…๋ ฅ์— ๋ฌธ์ œ๊ฐ€ ์—†์„์ •๋„์˜ Width๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š”๊ฒŒ ์ข‹๋‹ค.

 

์ด๋Ÿฌํ•œ Intrinsic Content๋ฅผ ์˜จ์ „ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ 2๊ฐ€์ง€ ์žˆ๋‹ค. 

Hugging priority

  • ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์œผ๋ฉด ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•จ.
  • ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์œผ๋ฉด ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค.
  • ๋‘ ์˜ค๋ธŒ์ ํŠธ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ปค์ ธ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

Compression Resistance priority

  • ์šฐ์„ ์ˆ˜์œ„๊ฐ€ ๋†’์œผ๋ฉด ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•จ.
  • ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์œผ๋ฉด ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์ง„๋‹ค.
  • ๋‘ ์˜ค๋ธŒ์ ํŠธ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ž‘์•„์ ธ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— ์‚ฌ์šฉํ•œ๋‹ค.
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.