Search
๐Ÿ“ง

View, ViewController Layout Cycle

์ƒ์„ฑ์ผ
2020/12/30 05:21
ํƒœ๊ทธ
iOS
์†์„ฑ
์†์„ฑ 1
์†์„ฑ 2
2021/01/30 08:59

View(ViewController) Layout Cycle

์„œ๋ก 

์•ฑ๊ฐœ๋ฐœ์˜ 40% ์ •๋„๋Š” View๋ฅผ ๊ทธ๋ฆฌ๊ณ  Layout์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์•ฑ์€ Frame๊ธฐ๋ฐ˜ Layout์„ ์‚ฌ์šฉํ•˜๋ฉฐ ๋˜ ์–ด๋–ค ์•ฑ์€ AutoLayout๊ธฐ๋ฐ˜์˜ Layout์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.iOS11๊ณผ iPhoneX์˜ ๋“ฑ์žฅ์œผ๋กœ ์‚ฌ์‹ค์ƒ AutoLayout์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.iPhoneX์‹œ๋ฆฌ์ฆˆ์˜ ๋…ธ์น˜๋””์ž์ธ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Frame๊ธฐ๋ฐ˜๋ณด๋‹ค AutoLayout๊ธฐ๋ฐ˜์ด ๋” ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ํ˜„์‹ค์ ์œผ๋กœ ๊ธฐ์กด Frame๊ธฐ๋ฐ˜์˜ ๋ ˆ์ด์•„์›ƒ์„ ํ•œ๋ฒˆ์— AutoLayout์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ์„ž์–ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์—ฌ๊ธฐ์—์„œ View(ViewController)์˜ Layout Cycle์„ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Layout Cycle์˜ ์ดํ•ด๋ฅผ ํ†ตํ•ด ์ข€ ๋” ๋‚˜์€ ์•ฑ์„ ๋งŒ๋“ค์ˆ˜ ์žˆ๋Š” ๊ณต๋ถ€๋ฅผ ๋ชฉ์ ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

View๋ฅผ ๊ทธ๋ฆฌ๋Š” 3๋‹จ๊ณ„ ํ”„๋กœ์„ธ์Šค

1.
Constraint Update
โ€ข
์ œ์•ฝ์กฐ๊ฑด(Constraint)๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค. Constraint๋Š” Code๋กœ๋„ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋Œ€๋ถ€๋ถ„ Interface Builder๋ฅผ ์ด์šฉํ•ด Constraint๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Constraint๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์ œ์•ฝ์กฐ๊ฑด์ด๋ฉฐ View๋ฅผ ์‹ค์ œ๋กœ ๋ฐฐ์น˜ํ•˜๋Š”๋ฐ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ Constraint๋ฅผ ๊ฐฑ์‹ ํ•˜์—ฌ Dynamic View๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
Constraint์˜ ์—…๋ฐ์ดํŠธ ์ˆœ์„œ๋Š” View ๊ณ„์ธต๊ตฌ์กฐ์—์„œ ๊ฐ€์žฅ ํ•˜์œ„๋ทฐ๋ถ€ํ„ฐ ์ƒ์œ„๋ทฐ๋กœ ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค.
1.
Layout Update
โ€ข
Layout์„ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ Layout์ด๋ž€ ๊ตฌ์ฒด์ ์ธ ๋ทฐ์˜ Frame ์ˆ˜์น˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. Constraint ๊ฐ’์„ ์ด์šฉํ•ด View๊ฐ€ ์œ„์น˜ํ•ด์•ผ ํ•  ์ˆ˜์น˜๊ฐ’์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
layout์˜ ์—…๋ฐ์ดํŠธ ์ˆœ์„œ๋Š” View์˜ ๊ณ„์ธต๊ตฌ์กฐ์—์„œ ๊ฐ€์žฅ ์ƒ์œ„๋ทฐ๋ถ€ํ„ฐ ํ•˜์œ„๋ทฐ๋กœ ๋‚ด๋ ค๊ฐ‘๋‹ˆ๋‹ค.
1.
Render
โ€ข
View๋ฅผ 2๋‹จ๊ณ„์—์„œ ๊ตฌํ•œ ์ˆ˜์น˜๊ฐ’์„ ์ด์šฉํ•ด ํ™”๋ฉด์— ์ง์ ‘ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. UIView์˜ DrawRect: ๋ฉ”์†Œ๋“œ๊ฐ€ ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

ViewController์˜ Layout Cycle

์ „ ๋‹จ๊ณ„์—์„œ ์ดํ•ดํ•œ 3๋‹จ๊ณ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ViewController์˜ Layout Cycle์„ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ViewController๋Š” ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” View๋“ค์˜ Constraint, Layout, Render ์ˆœ์„œ์— ๋”ฐ๋ผ Override ๋ฉ”์†Œ๋“œ๋“ค์„ ์‹œ์Šคํ…œ์˜ ํ˜ธ์ถœ์— ์˜ํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์œ„์น˜ ๋ณ€๊ฒฝ ๋“ฑ์œผ๋กœ View๋ฅผ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•  ๋•Œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ

โ€ข
Layout์„ ๊ฐฑ์‹ ํ•  ๋•Œ : setNeedsLayout() ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ View์— layout์„ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค. ์‹œ์Šคํ…œ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ณด๊ณ  ViewController์˜ Layout Update ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.
โ€ข
Constraint๋ฅผ ๊ฐฑ์‹ ํ•  ๋•Œ : setNeedsUpdateConstraints() ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ View์— constraint๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค. ์‹œ์Šคํ…œ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ณด๊ณ  ViewController์˜ Constraint Update ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.

ํ”Œ๋ž˜๊ทธ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค๋Š” ์˜๋ฏธ

โ€ข
์‹œ์Šคํ…œ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ setNeedsLayout() ๋˜๋Š” setNeedsUpdateConstraints()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐ”๋กœ View๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ํ•œ๋ฒˆ์˜ RunLoop ์•ˆ์—์„œ View์˜ ๊ฐฑ์‹ ์ด ์—ฌ๋Ÿฌ๋ฒˆ ์ผ์–ด๋‚˜๋ฉด ๋น„ํšจ์œจ ์ ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ–ˆ๋‹ค.
โ€ข
iOS๋Š” RunLoop๊ฐ€ ๋๋‚˜๊ณ  ๋‹ค์Œ RunLoop๋ฅผ ์‹คํ–‰ํ•  ๋•Œ view์˜ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ณด๊ณ  ํ•œ๋ฒˆ์— ๋ชจ๋“  View๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒํ–ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์œผ๋ฉด View๋Š” ๊ฐฑ์‹ ๋˜์ง€ ์•Š์„๊นŒ?

๊ฐœ๋ฐœ์ž๊ฐ€ View์— ๊ฐฑ์‹  ํ”Œ๋ž˜๊ทธ๋ฅผ ์‹ฌ๋Š”๊ฒƒ์€ ์˜ต์…˜, ์‹œ์Šคํ…œ์ ์œผ๋กœ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ผ€์ด์Šค๊ฐ€ ์žˆ๋‹ค.
โ€ข
View์˜ Frame ๋ณ€๊ฒฝ.
โ€ข
View์— subView๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ.
โ€ข
๋””๋ฐ”์ด์Šค์˜ orientation์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ.(๋””๋ฐ”์ด์Šค ํšŒ์ „)
โ€ข
Constraint Constant์˜ ๋ณ€๊ฒฝ.
๋“ฑ์ด ์žˆ์œผ๋ฉฐ. ์ด ๊ฒฝ์šฐ์—๋„ View๋Š” ๋‹ค์Œ RunLoop์—์„œ ๊ฐฑ์‹ ๋œ๋‹ค.

LayoutlayoutIfNeeded(), updateConstraintsIfNeeded()์˜ ์šฉ๋„

์œ„ ๋‹จ๊ณ„์—์„œ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ RunLoop์—์„œ View๋ฅผ ๊ฐฑ์‹ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.UIView์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋” ์‚ดํŽด๋ณด๋ฉด LayoutlayoutIfNeeded(), updateConstraintsIfNeeded()๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ๋ฉ”์†Œ๋“œ๋Š” ๋‹ค์Œ RunLoop๊ฐ€ ์•„๋‹Œ, ํ˜ธ์ถœ ๊ทธ ์ฆ‰์‹œ View๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ํ˜ธ์ถœ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ๋Š” Animation์ž…๋‹ˆ๋‹ค.UIView์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ View์˜ ์‹œ์ž‘์‹œ์ , View์˜ ๊ฐฑ์‹  ์ข…๋ฃŒ ์‹œ์  ๋‘๊ฐ€์ง€ End point๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ๋™์ž‘์ด๊ธฐ ๋•Œ๋ฌธ์— View๋ฅผ ๋ฐ”๋กœ ๊ฐฑ์‹ ์‹œ์ผœ์ค˜์•ผ ํ•˜๋ฉฐ ๊ทธ ์ด์œ ๋กœ ์œ„ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์•ฑ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ Server API์˜ ํ”Œ๋ž˜๊ทธ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ์— Dynamic View๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Layout Cycle์„ ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํ•œ ๋ฉ”์†Œ๋“œ์— ๋กœ์ง์„ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์—†๋Š” View๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ๊ณ„์—์—์† ์—ฐ์Šตํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์™œ iOS10 ์—์„œ๋Š” AutoLayout์ด ๋น„์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์„๊นŒ์š” ใ… ใ…œ