view, constraints๋ฅผ ์ฌ์ฉํด์ ๋ ์ด์์์ ์ค์ ํ๋ค.
-
Constrints๋ ๋ฌด์์ธ๊ฐ? ๋ทฐ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ๋ค.
-
์ง๊ด(intuition) << analyze(intuition -> practice)
iOS 11์์๋ self-sizing์ด ์ ๋๋ก ์ ์ฉ๋์ง ์์์ง๋ง 12์์๋ ๊ฐ์ ํ๋ค.
์๊ฐ๋ ๋ ์ ๊ฒ ๊ฑธ๋ฆฐ๋ค. (ํ๋์์ด iOS 12, ํ์์ด iOS 11)
IB๋ก(Interface Builder => storyboard) ๋ ์ด์์ ์์ฑํ๋ค๊ณ ๊ฐ์ ํด๋ณด์! ์ ๋ ์ด์์ ์ธํ ์ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋ค!
์ ์ฝ๋์ฒ๋ผ ์์ฑํ๋ฉด ๋ฌธ์ ๊ฐ ์๋ค!
- ๋ฌธ์ 1: UIView ๋ฉ์๋์ธ updateConstraints๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๊ณ ์๋ค.
- ๋ฌธ์ 2: ๊ธฐ์กด ๋ ์ด์์์ ๋ชจ๋ deactivate ์ํค๊ณ ์๋ก์ด ์ ์ฝ์ ์ถ๊ฐํ๋ค.
- super.updateConstraints ํธ์ถ์ ๋งค์ฐ ์ค์
๋จผ์ updateConstraints๊ฐ ๋ฌด์์ธ์ง ์์๋ณด์!
updateConstraints๋ Render loop์ ๊ตฌ์ฑ์์ ์ค ํ๋์ด๋ค. Render loop๋ ๋ฌด์์ธ๊ฐ? contents๊ฐ ๊ฐ frame์ ์ ์๋ฆฌ ์ก๋๋ก ์ต๋ ์ด๋น 120๋ฒ ๋์๊ฐ ์ ์๋ process์ด๋ค. ์ด 3๋จ๊ณ๋ก ์ด๋ค์ ธ์๋ค.(Update Constraints, Layout, Display)
- Update Constraints
- ๋จผ์ ๋ชจ๋ view๋ updateConstraints๋ฅผ ๋ฐ๋๋ค.(receive)
- view ๊ณ์ธต ํ๋จ์์(leaf) ๋ถ๋ชจ๋ก(window)
- layout
- layout์ ํธ์ถ
- window์์ leaf๋ก
- Display
- draw ํธ์ถ
- window์์ leaf๋ก
์ธ๋ฐ์๋ ์ผ์ ํ์ง ์๋๋ก(avoid wasted work)
UILabel์ text size๊ฐ ํ์ํ๋ค. text property, font, text size ๋ฑ์ด ์๋ค. ํ๋์ ๋ฐฉ๋ฒ: ํ๋์ ํ๋กํผํฐ๋ผ๋ ๋ณ๊ฒฝ๋๋ฉด ๋ค์ ์ธก์ (measure)ํด์ ํ์ธํ๋ค. ํ์ง๋ง, ์ ๋ฐฉ๋ฒ์ ๋ณดํต ๋นํจ์จ์ ์ด๋ค.(์ด์ : ์์ฐจ์ ์ผ๋ก ๋ค ๋ถ๋ฆด ๊ฒ์ด๋ค.) ํด๊ฒฐ: setNeedsUpdateConstraints ํธ์ถํ์ -> frame์ด screen์ผ๋ก ๊ฐ๊ธฐ ์ ๊ฐ์ฅ ๋ง์ง๋ง์ constraints๋ฅผ ๊ฐฑ์ ํ ๊ฒ์ ๋ณด์ฅํ๋ค.
render loop๋ ๋๋ฌด ๋ง์ด ๋ฐ๋ณต(120๋ฒ/s) ๋ฉ์๋๋ค์ด ๋ณ๋ ฌ์ ์ผ๋ก ๋์ํ๋ค.
๋ชจ๋ ๋ ์ด์์์ deactivateํ๊ณ activateํ๋ ๊ฒ(= churning the constaints)์ ๋ฌธ์ ๊ฐ ๋ญ๊น?
๋ชจ๋ subviews๋ฅผ ์ ๊ฑฐํ๊ณ ๋ค์ subviews๋ฅผ ๋ฃ๋ ๊ฒ๊ณผ ๋์ผํ๋ค. => ์ฆ, ์ฑ๋ฅ์ ๋์๋ค
๋ง์ง๋ง์ ๋ฑ ํ๋ฒ๋ง ํ๋๋ก ์์ ํ์
render loop๋ก ๋ถํ์ํ ์ผ์ ํ์ง ์์์ ์ข์ง๋ง "๋๋ฌด ์์ฃผ ๋์ํ๋ ์ฝ๋"๋ผ์ ์ธ๋ฐํ๊ฒ ๋ค๋ค์ผํ๋ค.
IB๋ฅผ ์ฌ์ฉํ๋ฉด ์์์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ ๊ฒฝ์ธ ํ์๊ฐ ์๋ค!
๋ ์ด์์์ ์ค์ ํ๋ ค๋ view๊ฐ ์๋ค. view๋ window์ ์๋ค. window๋ engine์ ๊ฐ์ง๋ค. engine์ autolayout์ ํต์ฌ์ด๋ค view์์ constraints๋ฅผ ๋ง๋ค๋ฉด equation์ด ์์ฑ๋๋ค. equation๋ engine์ ์ถ๊ฐ๋๋ค. equation๋ variable๊ณผ ๊ด๋ จ๋์ด ์๋ค.
ex. equation์์ x๊ฐ ๋ญ์ง ์๋ ค๋ฌ๋ผ๊ณ ํ๋ฉด view์ freme ๋ฐ์ดํฐ๋ฅผ ์์์ผํ๋ค. frame์๋ minX, minY, width, height๊ฐ ์๋ค.
๋จผ์ , equation์ ๋ง๋ ๋ค. ๋ view ๊ฐ์ ๊ฐ๊ฒฉ์ ๋ํ equation์ด ์ด์ํด ๋ณด์ผ ์ ์์ง๋ง, variable๊ด์ ์์์ ๋ฐฉ์ ์์ด๋ค!
์ด์ ๊ฐ equation์ engine์ ์ถ๊ฐ๋ผ์ผํ๋ค. engine์ variable์ ํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๋ค.
variable์ ํํจํ equation์ ๊ฒฝ์ฐ subtitutes๋ฅผ ์ฐพ์์ ๊ฐ์ ์ฐพ์๋ธ๋ค. ์ฆ, ์๋์ฒ๋ผ ์นํ๋๋ค.
=> engine์์ variable ํด์ํ๋ ๊ฒ์ ์ด์ ๋๋ฌ๋ค.(layout์ ์์ง ์๋๋ค.)
์ด๋๊น์ง๋ upateConstraints ๋จ๊ณ์์ ์ผ์ด๋๋ ์ผ! ์์ง ๋ด๋ถ์์ variabe์ด ๋ญ์ง ์๋ฉด view์๊ฒ ๊ฐ์ด ๋ฐ๋์๋ค๊ณ ์๋ฆฐ๋ค. ๊ทธ๋ฌ๋ฉด view๋ superview์ setNeedsLayout()์ ํธ์ถํ๋ค. ๊ทธ๋ฌ๋ฉด ๋์ค์ layout ๋จ๊ณ๋ก ์ด๋ํ๋ค.
engine์์ ํด๋น ๋ฐ์ดํฐ๋ค(์์์ ๊ณ์ฐํด์ ์ป์ ๊ฐ๋ค)์ frame์ ๋ณต์ฌํ๋ค. ๊ทธ๋ฌ๋ฉด subView๋ setBounds(), setCenter()๋ฅผ ํธ์ถํ๋ค. ๋ ์ด์์ ํ๋ก์ธ์ค ๋!
churning!(์ธ๋ฐ์์ด ๊ฐ์ ์ฐ์ฐ ๋ฐ๋ณต) ๊ฐ๋ณ์ ์ธ process๋ ๊ฐ๋จํ์ง๋ง ๋ถํ์ํ ๋์ผํ ์์ ์ด ๋งค๋ฒ ๋ฐ๋ณต๋๋ค.
์ด์ ๋ทฐ๊ฐ 4๊ฐ์ธ ์ํฉ ๋์ผํ superView๊ฐ ์๋๋ฐ ์๋์ ์ธ constraints ์ค์ -> ์ฑ๋ฅ์ ๋์๋ค.
์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ ๋ถ๋ชจ, ์์ ์ฌ์ด์๋ง ์ ์ฝ์ ์ค์ ํ๋ค.
2๊ฐ์ ๋ ๋ฆฝ์ ์ธ engine์ ํ์ฑํ๋ค. ๋ ๋ฆฝ์ ์ผ๋ก equation์ ๊ณ์ฐํ๋ค. variable๋ ๊ฒน์น๋ ๊ฒ(overlap)์ด ์๊ณ , ์ํธ์์ฉ(interact)๋ ํ์ง ์๋๋ค.
์๋ก ๊ฒน์น๋ ๋ถ๋ถ์ด ์์ผ๋ฉด(์์กด์ฑ์ด ์์ด์) ์ํธ์์ฉํ์ง ์์์, linearํ๊ฒ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์นจ ์ฆ, 2๊ฐ๋ฉด 2๋ฐฐ๋ก ๊ฑธ๋ฆฌ๋ ๊ฒ! 3๊ฐ๋ฉด 3๋ฐฐ!...
๋ ์ด์์ ์์ง์ ํน์ ๋ ์ด์์์ ์ ๋ฐ์ดํธํ๋ฉด ๋ฑ ํ์ํ ๊ฒ๋ง ์ ๋ฐ์ดํธํ๋ค.
์ ์ฝ ์ค์ ์ ์ค์ด๋ ค๋ ๋ ธ๋ ฅ์ ํ์ง ๋ง๋ผ, ์๋ฏธ์๋ค. ํ์ํ ์ ์ฝ์ ๊ทธ์ ์ธํ ํ๋ฉด ๋จ
2๊ฐ์ ์ ์ฝ์กฐ๊ฑด์ ํ๋๋ก ํํํ๋ค๋ณด๋ ์ ์ฒด์ ์ผ๋ก ๋ถ๋ช ํํ๊ณ ๋ณต์กํ ์ ์ฝ์ด ๊ตฌ์ฑ๋ ์ํ ์ฐ์ ์์๋์ ๋ฐ๋ผ ์ฌ๋ฌ ๋ ์ด์์์ ์ค์ ํ ์ํ ์ด๊ฒ๋ ์ข์ ์๊ฐ์ ์๋๋ค. ๊ฐ์ง ์์กด์ฑ์ ๋ง๋ค๊ฒ ๋๋๋ฐ, ๋ค๊ฐ ๋ ์ด์์ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌ ๋ชปํ๋ฉด debug๋ ์๋ ค์ฃผ์ง ๋ชปํ๋ค.
๊ฒฐ๋ก : ์ต๋ํ ์ง๊ด์ ์ผ๋ก(directly) ์ ์ฝ์ ์ค์ ํ๋ผ natural way๋ก ์ ์ฝ์ ์ค์ ํ๋ผ! ๊ทธ๋์ผ ํผํฌ๋จผ์ค์๋ ์ข๊ณ , ์ดํดํ๊ธฐ๋ ์ฝ๋ค.
๋๋ฑ ๋น๊ต์ ์ฐจ์ด๊ฐ ์๋ค. ์ ํํ๊ฒ๋ one more variable์ ์ฐจ์ด
engine์ด dependancy tracker๋ผ์ performance ์ต์ ํ๋ก ๋ ์ด์์์ ์์ฃผ ๋ฐ๊ฟ๋ ์ ์ํ ์ ๋ฐ์ดํธ๊ฐ ๋๋ค.
์ด๊ฑด ์์ ๊ฒ๋ค๊ณผ ๋ค๋ฅด๊ฒ ์กฐ๊ธ ๋ cost๊ฐ ๋ ๋ค.
priority๋ฅผ ๋ถ์ฌํ๋ ๊ฒ์ ํน์ ์ฌ์ด์ฆ + error
๋ฅผ ์์ฒญํ๋ error ๋ฅผ ์ต์ํํ๋ผ๊ณ ํ๋ ๊ฒ๊ณผ ๋์ผํ๋ค.
์ฆ, error ์ต์ํํ๋ ๋จ๊ณ๊ฐ ์ถ๊ฐ์ ์ผ๋ก ํ์ํ ๊ฒ์ด๋ค.
๋ ์ด์์์ด ๋ฐ๋ณต์ ์ผ๋ก ์ธํ ๋์ง ์๋๋กํ๋ผ(nil ํ์ธ) ๋ ์ด์์ ๊ณ์ฐ์ ๊ฐ๋จํ๋ค. Auto layout์ layout์ ์ํ cache์ด๋ค. ์ฆ, engine์ ๊ณ์ฐ๋ ๊ฐ๋ค์ ๊ฐ์ง๊ณ ์๊ณ dependency tracker๋ผ์ ์ด๋ค ๊ฐ์ด ๋ฐ๋๋ฉด ๋ฑ ๋ฐ๊ฟ์ผํ ๊ฒ๋ค๋ง ๋ณ๊ฒฝ(super targeted way)
์ง๊ด๋ง ๋ฏฟ๊ณ ๋ ์ด์์์ ์์ฑํ๋ฉด ์ฑ๋ฅ์ ๋์ ์๋...
tableViewCell ์์๋ก ๋ณต์กํ ๋ ์ด์์ ๊ตฌ์ฑ์ ์ ์ค์ ํ๋ ๋ฒ์ ๋ํด ์์๋ณด์
4๊ฐ์ ๋น์ทํ ๋ ์ด์์์ ๊ตฌ์ฑํด์ผํ๋ ์ํฉ
-> scroll performance๊ฐ ์ข์ง ๋ชปํ๋ค.
์ฌ์ฉ๋๋ CPU ๊ฐ์๋ฅผ ์ ์ ์๋ค. peak์ด ๋์ผ๋ฉด ์ฑ๋ฅ์ด ์ข์ง ์์ ๊ฒ ์ผ๋ง๋ ๋ง์ view๊ฐ ์ํฅ์ ๋ฐ๊ณ ์๋์ง๋ฅผ ๋ณด์ฌ์ค๋ค.
์ฌ๋ฌ peak์ด ์์ง๋ง churning์ด ์ ๋ ๋์ ๊ฒ์ ์ดํด๋ณด์
detailView๋ฅผ ์ดํด๋ณด๋ ๊ฒ
label 3๊ฐ๊ฐ churn ๋๋ ์ค์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
updateConstraints๊ฐ override ๋ ์ํ์ด๋ค. ๋ ์ด์์์ด ๋ฐ๋๋ฉด ๋ชจ๋ view์ ๋ ์ด์์์ ์ ๊ฑฐํ๋ค๊ฐ ๋ค์ ๋ฐฐ์น์์ผ์ ๋ฐ์ํ๋ ์ฑ๋ฅ์ issue
์ ์ํ๋ ๋ชจ๋ ๋ ์ด์์์ด ์์ด์ง ์ํ
hidden์ผ๋ก ๋ ์ด์์ issue ์ค์ฌ๋ณด์
๊ธฐ์กด ๋ ์ด์์์์ ํ๋์ ๋ทฐ์ ๋ํ interaction -> ๋ชจ๋ ๋ทฐ ๋ ์ด์์์ ์์จ ํ์๊ฐ ์์๊น?
hidden์ผ๋ก ์ฒ๋ฆฌํ์(view ๊ณ์ธต์์ ํด๋น view๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ๋ณด๋ค ์จ๊ธฐ๋ ๊ฒ์ด ํจ์ฌ cheap)
๋ชจ๋ ๋ทฐ๊ฐ ๊ธฐ์กด๊ณผ ๊ฐ์ ์์น์ ์๋๋ฐ๋ ๋์ผํ ์ฐ์ฐ์ ์งํํ๊ธฐ ๋๋ฌธ์ churn์ด ๋ฐ์ํ๋ ๊ฒ!
์ด๋ก์ ์ ์ ๊ธฐ์กด์ด๋ ๋์ผํ๊ธฐ ๋๋ฌธ์ ๊ฑด๋๋ฆฌ๋ฆฌ ๋ง์
๋ ธ๋์์ deactivateํ๊ณ ๋นจ๊ฐ์์ activate
UIImageView๋ ๋ด๋ถ์ image ์ฌ์ด์ฆ๋ฅผ ํตํด intrinsic content size๋ฅผ ๊ณ์ฐํ๋ค. UILabel์ text๋ฅผ ์ฌ์ฉํ๋ค.
text measurement๊ฐ ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ๋ overridingํ๋ ๊ฒ์ด ๋ ๋น ๋ฅด๋ค. ์ ์ฝ๋๋ text measurement๊ฐ ์์ด ๋ถ๋ชจ view์๊ฒ size๋ฅผ ์๋ ค์ฃผ๋ฉด์ ์ฑ๋ฅ์ ๋์ด๋ ๋ฐฉ๋ฒ
์ ์๋ engine ์์ ๊ฐ์ ๋ฃ์ ๋ ํ์๋ engine์์ size information์ ๊บผ๋ผ ๋ ์ฌ์ฉ ๋์ ๋ฐ๋ ๊ฐ๋ ! => ํ์๋ ์ฌ์ฉํ ์ผ์ด ์ ์์ง๋ง ์ฑ๋ฅ์ ์ข์ง ์์์ ์กฐ์ฌํด์ผํ๋ค.
system layout size fitting size ํธ์ถํ ๋๋ง๋ค engine์ด ์์ฑ๋๊ณ ์์ด์ง๋ค. self-sizing collection ์ด๋ table view cell์์ content view๋ก ํธ์ถํ ๋ ์ฌ์ฉํ๋๋ฐ, ์ด๋ฌ๋ฉด scrolling ์ต์ ํ๋ฅผ ๋ฌด์ํ๊ณ ๋ฐ๋ก overridingํ๋ ๊ฑฐ + ์ถ๊ฐ์ ์ธ engine์ ์์ฑํ๋ ๊ฒ์ด๋ผ ์ฑ๋ฅ์๋ ์ข์ง ์๋ค.