๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ฑ Mobile/iOS

[iOS - Swift] Auto Layout Constraint์˜ Priority์— ๋Œ€ํ•ด์„œ

Auto Layout์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ๋“ค์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ์กฐ์ ˆํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

 

Apple ์ œํ’ˆ๋“ค๋งŒ ๋ด๋„, ์•„์ดํฐ๋„ ๊ธฐ์ข… ๋ณ„๋กœ ๋‹ค์–‘ํ•œ ํ™”๋ฉด์˜ ํฌ๊ธฐ๊ฐ€ ์žˆ๋‹ค. ์•„์ดํŒจ๋“œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ์— Auto Layout์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค ๋ฐ ํ™”๋ฉด ํฌ๊ธฐ์—์„œ ์ผ๊ด€๋œ ๋ ˆ์ด์•„์›ƒ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์Šค์œ„ํ”„ํŠธ์—์„œ Auto Layout์„ ๋‹ค๋ฃฐ ๋•Œ Constraint์˜ ์šฐ์„ ์ˆœ์œ„(Priority)๋Š”

ํ•ด๋‹น ์ œ์•ฝ์กฐ๊ฑด์ด ๋‹ค๋ฅธ ์ œ์•ฝ์กฐ๊ฑด๊ณผ ์–ด๋–ค ์ˆœ์„œ๋กœ ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ง€์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์šฐ์„ ์ˆœ์œ„๋Š” ์ œ์•ฝ์กฐ๊ฑด๋“ค ์‚ฌ์ด์˜ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ณ  ์›ํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ ์ œ์•ฝ์กฐ๊ฑด์ด ์„œ๋กœ ์ถฉ๋Œํ•˜๋Š” ๊ฒฝ์šฐ์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ

์–ด๋–ค ์ œ์•ฝ์กฐ๊ฑด์„ ๋” ์ค‘์š”ํ•˜๊ฒŒ ์—ฌ๊ธธ ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋” ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์ œ์•ฝ์กฐ๊ฑด์€ ๋จผ์ € ๋ฌด์‹œ๋˜๊ฑฐ๋‚˜ ๋ถ€๋ถ„์ ์œผ๋กœ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์ƒํ™ฉ ๋ณ„ ์šฐ์„ ์ˆœ์œ„(priority) ์‚ฌ์šฉ

 

 

1. ํ™”๋ฉด ํฌ๊ธฐ ๋ณ€๊ฒฝ

ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์ง€๋Š” ๊ฒฝ์šฐ, ๋œ ์ค‘์š”ํ•œ ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ๊ฐ„๊ฒฉ์„ ์ค„์ด๊ณ 

๋” ์ค‘์š”ํ•œ ์š”์†Œ๋Š” ์œ ์ง€ํ•˜๋Š” ๋“ฑ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์š”์†Œ ๋ณ„๋กœ ์ ์ ˆํ•œ ๋ ˆ์ด์•„์›ƒ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋งŒ์•ฝ Horizontal StackView ์•ˆ์— Label๊ณผ imageView๊ฐ€ ์žˆ์„ ๋•Œ,

label์€ ๊ธธ์ด๊ฐ€ ์งง๊ณ  imageView๋Š” ํฌ๊ธฐ๊ฐ€ ํฐ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

 

์ด ๋•Œ ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ imageView์˜ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ imageView์˜ ๊ฐ€๋กœ ํญ ์ œ์•ฝ์— ๋” ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ค˜์„œ

ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์ง€๋”๋ผ๋„ imageView์˜ ํฌ๊ธฐ๋Š” ์ž‘์•„์ง€์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

2. ๋””๋ฐ”์ด์Šค ํšŒ์ „

์šฐ๋ฆฌ๋Š” ๋ณดํ†ต ์˜์ƒ์„ ์‹œ์ฒญํ•˜๊ฑฐ๋‚˜ ํ•ธ๋“œํฐ์œผ๋กœ ๋ฌธ์„œ๋ฅผ ๋ณผ ๋•Œ ๋””๋ฐ”์ด์Šค์˜ ๋ฐฉํ–ฅ์„ ๋ณ€๊ฒฝ์‹œํ‚จ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ์— ํ™”๋ฉด์˜ ๋ ˆ์ด์•„์›ƒ์ด ์–ด๋–ป๊ฒŒ ์กฐ์ •๋˜์–ด์•ผ ํ• ์ง€๋ฅผ Priority๋ฅผ ํ†ตํ•ด ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

textField๊ฐ€ ํ™”๋ฉด์˜ ๊ฐ€์šด๋ฐ์— ์œ„์น˜ํ•˜๋„๋ก ํ•˜๋Š” ์ œ์•ฝ๊ณผ

๋””๋ฐ”์ด์Šค์˜ ๋ฐฉํ–ฅ์ด ๋ฐ”๋€” ๋•Œ ํ™”๋ฉด ํ•˜๋‹จ์— ์œ„์น˜ํ•˜๋„๋ก ํ•˜๋Š” ์ œ์•ฝ์ด ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋Ÿฐ ๊ฒฝ์šฐ์— ํšŒ์ „์— ๋”ฐ๋ผ ๋” ์ค‘์š”ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•˜์—ฌ ํ™”๋ฉด์˜ ์›ํ•˜๋Š” ์˜์—ญ์— ๋” ๋งŽ์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

3. ๋‹ค์–‘ํ•œ ์ปจํ…์ธ ์˜ ๊ธธ์ด

๋‹ค์–‘ํ•œ ๊ธธ์ด์˜ ํ…์ŠคํŠธ๋‚˜ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค๋ฃฐ ๋•Œ, ์šฐ์„ ์ˆœ์œ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ

ํ…์ŠคํŠธ๋‚˜ ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์ž‘์•„์ง€์ง€ ์•Š๋„๋ก ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค.

 

textLabel ๋‚ด์šฉ์˜ ๊ธธ์ด๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ํ‘œ์‹œ๋  ๋•Œ, ๋ ˆ์ด์•„์›ƒ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํŠนํžˆ ๋‹ค๊ตญ์–ด ์ง€์› ์‹œ, textLabel์˜ ํญ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์•„ ํ…์ŠคํŠธ๊ฐ€ ์งค๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

 

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” textLabel์˜ ํญ์„ ์ถฉ๋ถ„ํžˆ ํ™•๋ณดํ•˜๋„๋ก ๋ ˆ์ด์•„์›ƒ์„ ์กฐ์ ˆํ•˜๊ณ 

๋” ์ค‘์š”ํ•œ ๋ ˆ์ด์•„์›ƒ ์š”์†Œ์— ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

Code๋กœ ๋ณด๊ธฐ 

์ˆ˜ํ‰์œผ๋กœ ๋‘๊ฐœ์˜ View๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ํ•˜๋‚˜์˜ View๋Š” ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ค๋”๋ผ๋„ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ ์ž ํ•  ๋•Œ

 

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let firstView = UIView()
        firstView.backgroundColor = .black
        firstView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(firstView)
        
        let secondView = UIView()
        secondView.backgroundColor = .blue
        secondView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(secondView)
        
        // firstView์˜ ํญ์„ secondView์˜ ํญ๊ณผ ๊ฐ™๊ฒŒ ์„ค์ •
        let constraint1 = firstView.widthAnchor.constraint(equalTo: secondView.widthAnchor)
        // ์šฐ์„ ์ˆœ์œ„ ์„ค์ •
        constraint1.priority = .defaultHigh
        constraint1.isActive = true
        
        // firstView์˜ ๋†’์ด ์ œ์•ฝ
        let constraint2 = firstView.heightAnchor.constraint(equalToConstant: 100)
        constraint2.isActive = true
        
        // secondView์˜ ์œ„์น˜ ์ œ์•ฝ
        let constraint3 = secondView.topAnchor.constraint(equalTo: view.topAnchor, constant: 50)
        let constraint4 = secondView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        constraint3.isActive = true
        constraint4.isActive = true
    }
}

 

constraint1์€ firstView์˜ ํญ์„ secondView์˜ ํญ๊ณผ ๊ฐ™๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  constraint1์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ defaultHigh๋กœ ์„ค์ •ํ•˜์—ฌ, ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ค ๋•Œ๋„ firstView์˜ ํญ์ด ์œ ์ง€๋˜๋„๋ก ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ™”๋ฉด์ด ์ž‘์•„์ ธ๋„ firstView์˜ ํญ์€ ์ถ•์†Œ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

 

 

 

์šฐ์„ ์ˆœ์œ„(priority) ์„ค์ • ์‹œ ์ฃผ์˜ํ•  ์ 

 

1. ๋ชจํ˜ธํ•จ (Ambiguity) ๋ฌธ์ œ

์šฐ์„ ์ˆœ์œ„๋ฅผ ๋„ˆ๋ฌด ๋‚ฎ๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋ชจํ˜ธํ•œ ๋ ˆ์ด์•„์›ƒ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

์ฆ‰, ์–ด๋–ค View์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜๊ฐ€ ๋ชจํ˜ธํ•ด์ ธ Auto Layout์ด ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ๋œ๋‹ค. 

 

 

2. ์ˆœํ™˜ (Cycle) ๋ฌธ์ œ

์ œ์•ฝ์กฐ๊ฑด ์‚ฌ์ด์— ์ˆœํ™˜์ ์ธ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์„ค์ •๋˜๋ฉด

Auto Layout ์‹œ์Šคํ…œ์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์ง€๊ฒŒ ๋œ๋‹ค. 

์ด ๋•Œ๋ฌธ์— ์•ฑ์ด ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ํฌ๋ž˜์‹œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

3. ๋ถˆ์ผ์น˜ ๋ฌธ์ œ

์šฐ์„ ์ˆœ์œ„๋ฅผ ์„ค์ •ํ•ด๋„ ๋‹ค๋ฅธ ์ œ์•ฝ์กฐ๊ฑด ์‚ฌ์ด์—์„œ ์ถฉ๋Œ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. 

 

 

4. ๋ณด๊ธฐ์˜ ๋น„์ •์ƒ์ ์ธ ๋™์ž‘ ๋ฌธ์ œ

๋„ˆ๋ฌด ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ชจ์ˆœ๋œ ์ œ์•ฝ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜๋ฉด View๊ฐ€ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ ˆ์ด์•„์›ƒ์ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค

 

 

5. ๋ ˆ์ด์•„์›ƒ ์ถฉ๋Œ

์šฐ์„ ์ˆœ์œ„๋ฅผ ์กฐ์ ˆํ•˜๋ฉด์„œ๋„ ์›ํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ์„ ์–ป์„ ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

728x90