๐ŸŽ iOS/UIkit

UIView์˜ Drawing Cycle

JerryiOS 2023. 3. 24. 00:04

RunLoop

๋ทฐ์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ ๊ณ„์† ๋ฐ˜๋ณตํ•ด์„œ ์‹คํ–‰๋œ๋‹ค.

Update Cycle

1/60์ดˆ์˜ ์ฃผ๊ธฐ๋งˆ๋‹ค ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ ค์ค€๋‹ค.

Layout, Display, Constraints๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

Main Run Loop

์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ ์ ˆํ•œ ์‘๋‹ต์„ ํŠธ๋ฆฌ๊ฑฐํ•œ๋‹ค.

Main Run Loop์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ๋Š” Update Cycle์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

Drawing Cycle

1. ์•ฑ์ด ์‹œ์ž‘๋ ๋•Œ ์•ฑ์„ ๋‹ด๋‹นํ•˜๋Š” Main Run Loop๊ฐ€ ์ƒ๊ธฐ๊ณ 
2. Main Run Loop๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ํŠธ๋ฆฌ๊ฑฐํ•œ๋‹ค.
3. Main Run Loop์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์— Update Cycle์ด ๋ฐœ์ƒํ•˜์—ฌ ํ™”๋ฉด์ด ๋‹ค์‹œ ๊ทธ๋ ค์ง„๋‹ค. (ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ทฐ๋ฅผ ์ „์ฒด์ ์œผ๋กœ ๋‹ค์‹œ ๊ทธ๋ฆผ)

ํŒŒ๋ž€์ƒ‰ ๋ถ€๋ถ„์ด ๋ทฐ์˜ Drawing Cycle

 

Update cycle ์ค‘ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ

updateConstraints

์ œ์•ฝ์กฐ๊ฑด(์˜คํ† ๋ ˆ์ด์•„์›ƒ)์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

layoutSubviews

ํ•˜์œ„ ๋ทฐ์˜ layout์„ ์žฌ์กฐ์ •ํ•œ๋‹ค.

drawRect

๋‚ด๋ถ€ ์ปจํ…์ธ ๋ฅผ ๊ทธ๋ฆฐ๋‹ค.

 

Update Cycle์ด ๋ฐœ์ƒํ•  ๋•Œ updateConstraints, layoutSubviews, drawRect๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

 

Drawing์„ ์ œ์–ดํ•˜๋Š” ๋ฉ”์„œ๋“œ

setNeedsUpdateConstraints()

๋‹ค์Œ ์‹ธ์ดํด์— ์˜คํ† ๋ ˆ์ด์•„์›ƒ ์กฐ์ •ํ•˜๋„๋ก ์„ธํŒ…ํ•œ๋‹ค.

setNeedsLayout()

๋‹ค์Œ ์‹ธ์ดํด์— ๋ ˆ์ด์•„์›ƒ ์กฐ์ •ํ•˜๋„๋ก ์„ธํŒ…ํ•œ๋‹ค.

setNeedsDisplay()

๋‹ค์Œ ์‹ธ์ดํด์— ๊ทธ๋ฆผ์„ ๋‹ค์‹œ๊ทธ๋ฆฌ๋„๋ก ์„ธํŒ…ํ•œ๋‹ค.

updateConstraintsIfNeeded()

๊ณง๋ฐ”๋กœ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์กฐ์ •ํ•œ๋‹ค.

layoutIfNeeded()

๊ณง๋ฐ”๋กœ ๋ ˆ์ด์•„์›ƒ์„ ์กฐ์ •ํ•œ๋‹ค.

 

์‚ฌ์šฉ ์˜ˆ์‹œ

UIView.animate(withDuration: 2) {
    self.view.layoutIfNeeded()
}  completion: { success in
    print("์• ๋‹ˆ๋ฉ”์ด์…˜")
}

layoutIfNeeded()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ๋งŒ AutoLayout์ด ์›€์ง์ด๋Š” ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

์ฐธ๊ณ : https://inuplace.tistory.com/1137

๋ฐ˜์‘ํ˜•