[iOS] iOS๋ ํ๋ฉด์ ์ด๋ป๊ฒ ๊ทธ๋ฆด๊น? RunLoop ๋ถํฐ Constraint, Layout, Display ๊น์ง
๋ฐ๋ฃจํ๋ถํฐ ํ๋ฉด์ ๋ทฐ๊ฐ ๊ทธ๋ ค์ง๊ธฐ๊น์ง.
์คํฐ๋๋ฅผ ํ๋ฉด์ ๊ธฐ์ ๋ฐํ๊ฐ ์์๋๋ฐ์, ์ค๋นํ ๋ด์ฉ์ ์ ๋ฆฌํด๋๊ฒ ์ต๋๋ค! ๊ฑฐ์ ํผํผํฐ์ ๋ชจ๋ ๊ฑธ ๋ค ๋ด์์ ๊ธ์ ๋ง์ด ์์ ๊ฒ ๊ฐ์์ใ ใ
RunLoop(๋ฐ๋ฃจํ)
iOS์์ ๋ฐ์ํ๋ ๋ชจ๋ ์ด๋ฒคํธ๋ RunLoop๋ฅผ ๊ฑฐ์ณ ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ RunLoop์ ๋ํ ์ดํด๊ฐ ๋จผ์ ํ์ํฉ๋๋ค!
๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๋ฉด, RunLoop๋ ๋ชจ๋ ์ค๋ ๋์ ํ๋์ฉ ์กด์ฌํ๋ฉด์ ์์คํ ์ ๋ค์ด์ค๋ ๋ ์ข ๋ฅ์ ์ด๋ฒคํธ, Input Source์ Timer Source๋ฅผ ์ฒ๋ฆฌํ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฃจํ์ ๋๋ค.
UIApplication์ด ์คํ์์ผ์ฃผ๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ ์ธํ๊ณ ๋ ๋ฐ๋ฃจํ๋ ์๋์ผ๋ก ์คํ๋์ง ์์์!
๋ฐ๋ฃจํ๋ ์ด๋ฐ ๊ณผ์ ์ ๊ฑฐ์ณ์ ์คํ๋๋๋ฐ์, ์์คํ ์ ๋ค์ด์ค๋ ์ด๋ฒคํธ๋ค์ ๊ณง๋ฐ๋ก ๋ฐ๋ฃจํ๋ก ์ ๋ฌ๋๋ ๊ฒ์ด ์๋๋ผ Event Queue๋ผ๋ ๋๊ธฐ์ด์ ์์ด๊ณ , ๋ฐ๋ฃจํ๋ ์คํ์ด ๋ ๋ ์ฌ๊ธฐ์ ์๋ ์ด๋ฒคํธ๋ค์ ๊ฐ์ ธ์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ฃจํ๊ฐ ๊ฐ์ ธ์จ ์ด๋ฒคํธ๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ฒด์ ์ ๋ฌ๋๊ณ , ์ด ๊ฐ์ฒด๋ ๊ฐ ์ด๋ฒคํธ๋ค์ ์ฒ๋ฆฌํ๋ ์๋น์ค ๋ฃจํด์ ์ฐพ์ ์คํ์ํค์ฃ . ์ด ์๋น์ค ๋ฃจํด์๋ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๋ ํฌํจ๋ ์ ์์ต๋๋ค.
์๋น์ค ๋ฃจํด์ด ์ข ๋ฃ๋๋ฉด ํจ์๋ค์ด ๋ชจ๋ ๋ฐํ๋๊ฒ ์ฃ ? ๋ฐ๋ฃจํ๋ ์์ ์ ์ฌ์ดํด์ ์คํ์์ผฐ๋ ํจ์๋ค์ด ๋ชจ๋ ๋ฐํ๋๋ฉด Update Cycle์ด๋ผ๋ ํน๋ณํ ๋ฃจํด์ ์คํํฉ๋๋ค.
Update Cycle
์ ๋ฐ์ดํธ ์ฌ์ดํด์ Layout, Display, Constraint๋ฅผ ๊ฐฑ์ ํ๋ ์์ ์ ์ฌ์ดํด์ธ๋ฐ์, ์ ์ธ ์น๊ตฌ๋ค์ ์๋์์ ๋ฐ๋ก ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค. ์ง๊ธ์ ๋๋ต์ ์ผ๋ก ํ๋ฉด์ ์ ๋ฐ์ดํธํ๋ค! ๋ผ๊ณ ์๊ฐํด๋ณด๋ฉด ๋ ๊ฒ ๊ฐ์์.
๊ทธ๋ฆฌ๊ณ ์ ๋ฐ์ดํธ ์ฌ์ดํด์ ํญ์ ์คํ๋๋ ๊ฒ์ด ์๋๋ผ ๋ฐ๋ฃจํ์ ๋ง์ง๋ง ์ง์ ์์ ์คํ๋ฉ๋๋ค. ๊ทธ๋์ ์ฌ์ฉ์๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ง๋ค์ด๋ ๊ณง๋ฐ๋ก ํ๋ฉด์ด ์ ๋ฐ์ดํธ๋์ง๋ ์์ต๋๋ค.
์ ๋ฐ์ดํธ ์ฌ์ดํด์ ๋๋ต 1์ด์ 60๋ฒ ์ ๋์ ์ฌ์ดํด์ ๋๊ฒ๋ฉ๋๋ค. ๊ทธ๋์ ์ฌ์ฉ์๊ฐ ๋ฐ์์ํจ ์ด๋ฒคํธ์ ๋ํด ๊ณง๋ฐ๋ก ๋ฐ์ํ์ง ์์๋ ์ฌ์ฉ์๋ ๋ด๋ถ์ ์ผ๋ก ์ด๋ค์ผ์ด ์ผ์ด๋ฌ๋์ง ์ ์ ์์ฃ .
ํ์ง๋ง ์ด๋ค ๊ฒฝ์ฐ์๋ ์ฆ๊ฐ์ ์ธ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ๋๊ฐ ์๊ฒ ์ฃ ? ๊ทธ๋์ UIView๋ ๊ฐ๋ฐ์๋ค์ด ์ ๋ฐ์ดํธ ์ฌ์ดํด์ ์ ์ดํ ์ ์๋ ๋ฉ์๋๋ค์ ์ ๊ณตํ๊ฒ๋ฉ๋๋ค.
Layout
๊ทธ๋ผ ๋ ์ด์์์ด ๋ญ๊น์? ๋จ์ํฉ๋๋ค. ๋ ์ด์์์ ์ด๋ค ๋ทฐ์ ํฌ๊ธฐ(๊ฐ๋ก, ์ธ๋ก)์ ์์น(x, y)๋ฅผ ์๋ฏธํด์! ์ฆ, ํ๋ ์ ๊ทธ ์์ฒด์ ๋๋ค.
๋ชจ๋ ๋ทฐ๋ ํ๋ ์์ ๊ฐ์ง๊ณ ์์ฃ . ๊ทธ๋์ UIView์๋ ์ด ๋ ์ด์์์ ์ ๋ฐ์ดํธํ๋ ์ฌ์ดํด์ ์ ์ดํ๋ ๋ช๊ฐ์ง ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
LayoutSubviews
layoutSubviews๋ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ทฐ์ ๊ทธ ํ์์ ์๋ ๋ชจ๋ subview์ ์์น์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ๋๋ก ํฉ๋๋ค.
์ด ๋ฉ์๋๊ฐ ๋ถ๋ ธ์ ๋ ๋ณ๊ฒฝ์ฌํญ์ด ์๋ ๋ทฐ๋ค๋ ๋ค ๋ค์ ๊ทธ๋ฆฌ๋ฉด ์ค๋ฒํค๋๊ฐ ๋๋ฌด ํฌ๊ฒ ์ฃ ? ๊ทธ๋์ ์์คํ ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๋๋ง๋ค ํด๋น ๋ทฐ์ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ๋ค๋ ๋งํน์ ๋ถ์ฌ๋ก๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ฐ์ดํธ ์ฌ์ดํด์ด ์์๋์ด์ layoutSubviews๊ฐ ํธ์ถ๋๋ฉด ๋งํน๋ ๋ทฐ์ ์๋ธ๋ทฐ๋ค์ ์ฐพ์๊ฐ ๋ ์ด์์์ ์ ๋ฐ์ดํธ ํด์ฃผ๊ฒ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ ํ์ ์ด ๋ฉ์๋๊ฐ ๋น์ฉ์ด ๊ต์ฅํ ํฐ ์ฐ์ฐ์ด๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ ๊ฒ ์ธ์๋ ์ธ๋ถ์์ ํธ์ถํ์ง ๋ง๋ผ๊ณ ํ๊ณ ์์ด์.
๋์ ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ค๋๋ค.
๋งํน์ ์กฐ๊ฑด
๋ ์ด์์์ด ๋ณ๊ฒฝ๋๋ ์กฐ๊ฑด์ ์์ ์ ํ ๊ฒ๊ณผ ๊ฐ์์.
setNeedsLayout
๋น์ฉ์ด ํฐ layoutSubviews ๋์ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๊ฐ setNeedsLayout์ ๋๋ค. setNeedsLayout์ ๋ค์ ๋์์ค๋ ์ฌ์ดํด์ ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ผ๊ณ ๋งํนํด๋๊ณ ์ข ๋ฃ๋ฉ๋๋ค.
์ด๋ ๊ฒ ๋งํน๋ ๋ทฐ๋ ๋ค์ ์ ๋ฐ์ดํธ ์ฌ์ดํด์์ layoutSubviews์ ์ํด ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
layoutIfNeeded
ํ์ง๋ง ์ ๋ฐฉ๋ฒ์ ์ฌ์ ํ ๋ค์ ์ฌ์ดํด๊น์ง ๊ธฐ๋ค๋ ค์ผํ๋ ๋ฌธ์ ๊ฐ ์์ด์. ๊ทธ๋์ ์ฆ๊ฐ์ ์ผ๋ก ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋๋ก layoutIfNeeded ๋ผ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
layoutIfNeeded๋ ์คํ์ด๋๋ฉด ๊ณง๋ฐ๋ก layoutSubview๋ฅผ ์คํํ๊ณ ์ ๋ฐ์ดํธ๊ฐ ๋ง์น๋ฉด ์ข ๋ฃ๋๋, ๋๊ธฐ์ ์ผ๋ก ๋์ํ๋ ํจ์์ ๋๋ค. ํ์ง๋ง ์ด๋ฒ์๋ ์ ๋ฐ์ดํธ ์ฌ์ดํด์ ๊ฐ์ ๋ก ์์ํ๋ ๋น์ฉ์ด ๋น์ธ๊ฒ ์ฃ .
๊ทธ๋์ ์ ํ์ ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด setNeedsLayout์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
layoutIfNeeded๊ฐ ๋ฐ๋์ ํ์ํ ๊ฒฝ์ฐ๋ ์ ๋๋ฉ์ด์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ธ๋ฐ์, ์ ๊ฐ์ ๊ฒฝ์ฐ์์ constraint๋ฅผ ๋ฐ๊ฟ์ค ํ์ ๋ณ๊ฒฝ๋ ๋ ์ด์์์ ์ ์ฉํ์ง ์๊ณ ์ ๋๋ฉ์ด์ ์ ์คํํ๋ฉด ์ ๋๋ฉ์ด์ ์ด ๋์ํ์ง ์๊ฒ ๋ฉ๋๋ค. ์์ง ์ฌ์ดํด์ด ์์๋์ง ์์๊ฑฐ๋ ์.
๊ทธ๋์ ์ ๋๋ฉ์ด์ ์ด ์์๋๊ธฐ ์ง์ ์ ๋ชจ๋ ๋ ์ด์์์ ๋ค ์ ์ฉ์์ผ๋๊ณ ์ ๋๋ฉ์ด์ ๊ณผ ํจ๊ป ์ ๋ฐ์ดํธ ์ฌ์ดํด์ ๋๋ฆด ์ ์์ต๋๋ค.
Display
Display๋ ์ฌ์ด์ฆ๋ ์์น์ ์๊ด์์ด ํ๋ฉด์ ๊ทธ๋ ค์ง๋ ์์๋ค์ ์๋ฏธํฉ๋๋ค.
Draw
๊ทธ๋ฆฌ๊ณ draw๋ ์ด๋ฐ ์์๋ค์ ๊ทธ๋ฆฌ๋ ๋ฉ์๋์ ๋๋ค. ์ด๋ฒ์๋ ์ ํ์ ์ง์ ํธ์ถํ๋ ๊ฒ์ ์ง์ํ๋ผ๊ณ ๋งํ๋๋ฐ์, ๋์ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๋ค์ ์์๋ด ์๋ค!
setNeedsDisplay
์ด๋ฆ์ฒ๋ผ setNeedsLayout๊ณผ ๋์ผํ ๋์์์ ๋์์ด Display์ธ ๊ฒ๋ง ๋ค๋ฆ ๋๋ค.
DisplayIfNeeded๋ ์์ด์ใ ใ ๋ง์ฝ ์ฆ๊ฐ์ ์ธ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ๋ค๋ฉด didSet๊ฐ์ ํ๋กํผํฐ ์ต์ ๋ฒ๋ก setNeedsDisplay๋ฅผ ํธ์ถํ๊ณ draw ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ผ๊ณ https://tech.gc.com/demystifying-ios-layout/ ์ด ๊ธ์ ์ ์๋ถ์ ๊ถํ๊ณ ์์ด์.
Constraints
Constraints๋ ์คํ ๋ ์ด์์์ ์ฌ์ฉํ๋ ๋ทฐ๋ค์ ์ ์ฝ์กฐ๊ฑด์ ์๋ฏธํฉ๋๋ค.
UpdateConstraints
UpdateConstraints ๋ฉ์๋๋ ๋ทฐ์ Constraint๋ฅผ ์ ๋ฐ์ดํธํ ๋ ๋ถ๋ฆฌ๋ ๋ฉ์๋์ ๋๋ค. ์ด๋ฒ์๋ ์ญ์ ์ ๋ฐ์ดํธ ์ฌ์ดํด์์ ๋ถ๋ฆฌ๊ฒ ์ฃ ?
๋ทฐ์ Constraint๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋งํน์ด ๋๊ณ , ์ ๋ฐ์ดํธ ์ฌ์ดํด์์ ๋งํน๋ ๋ทฐ๋ค์ Constraint๋ฅผ ์ ๋ฐ์ดํธํ๊ฒ ๋ฉ๋๋ค.
setNeedsUpdateConstraints
๋ ์ด์์๊ณผ ๋์คํ๋ ์ด์ ์ฌ์ฉ๋๋ ๋ฉ์๋๋ค์ฒ๋ผ ๋ค์ ์ฌ์ดํด์ ์ ๋ฐ์ดํธํ ๋ทฐ๋ฅผ ๋งํนํ๋ ๋ฉ์๋์ ๋๋ค.
updateConstraintsIfNeeded()
Constraints๋ ์ฆ์ ์ ๋ฐ์ดํธํ๋ ๋ฉ์๋๊ฐ ์ ๊ณต๋ฉ๋๋ค! updateConstarintsIfNeeded()๋ฅผ ํธ์ถํ๋ฉด updateConstraint๊ฐ ๊ณง๋ฐ๋ก ์คํ๋ฉ๋๋ค.
์ด๋ ๋ง์ฝ setNeedsUpdateConstraints๊ฐ ์์ฝํ๋ ์ฌ์ดํด ์ด์ ์ ์คํ๋์๋ค๋ฉด, ๋งํน์ ์ง์ฐ๊ณ ๋ค์ ์ฌ์ดํด์์ ๋ ๋ฒ ์ ๋ฐ์ดํธ๋์ง ์๋๋กํฉ๋๋ค.
invalidateIntrinsicContentSize
Constraint์๋ ํน๋ช ํ ๋ฉ์๋๊ฐ ํ๋ ์ถ๊ฐ๋์ด ์๋๋ฐ์, intrinsicSize์ ๋ณ๊ฒฝ์ ์ ๋ฐ์ดํธ ์ฌ์ดํด์ ์์ฝํ ์ ์๋ ๋ฉ์๋์ ๋๋ค.
์ปค์คํ ๋ทฐ์ intrinsicContentSize๋ฅผ ์ ์ฉํ๊ฑฐ๋, ์ค๋ฒ๋ผ์ด๋ฉ๋์ด ๋ณ๊ฒฝ๋ intrinsicContentSize๋ฅผ ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ด ๋ฉ์๋๋ฅผ ํธ์ถํด ์ ๋ฐ์ดํธ ์ฌ์ดํด์ ๋ณ๊ฒฝ์ ๋ฑ๋กํ ์ ์์ต๋๋ค.
์ ๋ฆฌ!
์๋ ํ๋ https://tech.gc.com/demystifying-ios-layout ์ด ๊ธ ๋ง์ง๋ง์ ๋์์๋ ํ๋ฅผ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๊ฑด๋ฐ์, ์ค์ ๋ก ์์๋ค์ ์ ๋ฐ์ดํธํ ๋ ํธ์ถํ๋ ๋ฉ์๋์, ๋งํนํ๋ ์์ ์ ๋ํ ๋ฉ์๋๋ฅผ ์ ๋ฆฌํด๋์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์๋ ๊ทธ๋ฆผ์ ๋ทฐ์ ๋ทฐ์ปจํธ๋กค๋ฌ๊ฐ ๊ทธ๋ ค์ง๋ ์ฌ์ดํด์ ๊ทธ๋ ค๋ณธ ๊ฒ์ ๋๋ค! https://medium.com/@Alpaca_iOSStudy/viewcontroller-view-lifecycle-daed5766e02b ์ด ๊ธ์์ ์์ฒญ๋๊ฒ ๋ถ์์ ๊ผผ๊ผผํ ํด์ฃผ์ ์ ์ด๋ฒ์ ๊ณต๋ถํ๋ฉด์ ๋์๋ ์ฃผ์ํ ๋ฉ์๋๋ค์ ์์๋๋ก ๋์ดํด๋ณด์์ต๋๋ค! ์ค์ ๋ก ํ๋ฉด์ด ๊ทธ๋ ค์ง ๋ Constraint, Layout, Display ์์ผ๋ก ๊ทธ๋ ค์ง๋ค๋ ๊ฒ์ ์ ์ ์๋ค์..!
์ค๋์ ๊ธ์ ๋๋ถ๋ถ Demystifyinh iOS layout ๊ธ์ ์ ๊ฐ ์ดํดํ๋๋ก ๋ค์ ์ ๋ฆฌํ๋ฉด์ ์์ฑํ์ด์. ์๋ฌธ์ด ์ ๋ง ์ ์ฐ์ฌ์ ธ ์์ผ๋ ์ฝ์ด๋ณด์๋๊ฑธ ์ถ์ฒ๋๋ฆฝ๋๋ค!
Reference
'๐ ์์ด-์ค-์์ค > ๐ฑ iOS ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote