
์ฝ๋๋ฒ ์ด์ค๋ก UI๋ฅผ ๊ทธ๋ฆฌ๋ค๊ฐ cornerRadius๊ฐ ์ ์ฉ ๋์ง ์์๋ ๊ฒฝํ์ด ์์ง ์์ผ์ ๊ฐ์?
์ด๋ View์ Drawing Cycle๊ณผ ์ฐ๊ด์ด ์๋๋ฐ์, UI๋ฅผ ์ ๋๋ก ํธ๋ค๋งํ๊ธฐ ์ํด์ View Drawing Cycle์ ๋ํด ์์๋ณด์์ต๋๋ค.
๋ทฐ๊ฐ ๋ก๋ ๋๊ฑฐ๋ ๋ณ๊ฒฝ์ด ์์๋ ํ๋ฉด์ ์๊ฐ์ ์ผ๋ก ํํ๋์ด ๊ทธ๋ ค์ง๋ ์ฌ์ดํด
๋ทฐ๋ Constraints(์ ์ฝ์กฐ๊ฑด)์ ์ด์ฉํด์ Layout(Size, Position)์ ๊ฒฐ์ ํ๊ณ ๊ทธ Layout์ ํ ๋๋ก UI๋ฅผ ๊ทธ๋ฆฝ๋๋ค.
UIKit์์๋ ์ด ๊ณผ์ ์ Drawing Cycle์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
updateConstraints()โlayoutSubviews()โdraw(_:)
์ด ๋ฉ์๋๋ค์ ๊ณตํต์ ์ ์์คํ ์ฌ์ดํด์ ๋ง๊ฒ ํธ์ถ์ด ๋์ด์ผ ํ๋ฏ๋ก ์ง์ ํธ์ถํด์๋ ์๋ฉ๋๋ค. ์ง์ ํธ์ถํ๊ฒ ๋๋ฉด ์ ์์ ์ธ ํ์ด๋ฐ์ ํธ์ถ๋๋๊ฒ ์๋๋ฏ๋ก ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ค๋ฒ๋ผ์ด๋ ๋ฐ super ํธ์ถ์ ํ๊ฑฐ๋, ์์ฝ ๋ฉ์๋๋ก ์์คํ ์ด ์ ์ ํ ์์ ์ ํธ์ถํ๋๋ก ํด์ผ ํฉ๋๋ค.


๋ทฐ์ Constraints๋ฅผ ์ ๋ฐ์ดํธ ํด์ค๋๋ค.
ํ์ฌ ๊ธฐ๊ธฐ์ ํ๋ฉด ํฌ๊ธฐ์ ๋ถ๋ชจ ๋ทฐ์ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐฑ์ ๋ฉ๋๋ค.
override func updateConstraints() {
// ์ปค์คํ
์ ์ฝ ์กฐ๊ฑด ์
๋ฐ์ดํธ
super.updateConstraints()
}
super.updateConstraints()๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.setNeedsUpdateConstraints() / updateConstraintsIfNedded() ๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.ํ์ ๋ทฐ์ ๋ ์ด์์(์์น, ํฌ๊ธฐ)๋ฅผ ์ฌ์กฐ์ ํฉ๋๋ค.
๋ทฐ ๋ค์ ๋ ์ด์์ ํ๋ ์์ด ์ ํด์ง๋ ์๊ธฐ์ ๋๋ค.
override func layoutSubviews() {
super.layoutSubviews()
// ๋ ์ด์์ ์
๋ฐ์ดํธ
}
setNeedsLayout() / layoutIfNeeded()๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ , ์ถ๊ฐ์ ์ธ ์
๋ฐ์ดํธ๊ฐ ํ์ํ๋ค๋ฉด ์ค๋ฒ๋ผ์ด๋ํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.๋ทฐ์ ์ค์ ์ฝํ ์ธ (๊ทธ๋ํฝ ์์)๋ฅผ ๊ทธ๋ฆฝ๋๋ค.
override func draw(_ rect: CGRect) {
super.draw(rect)
// ์ปค์คํ
๊ทธ๋ฆฌ๊ธฐ ์ฝ๋
}
draw(_:)๊ฐ ํ์ ์์ต๋๋ค.setNeedsDisplay() ๋ก ์์ฝํ๊ฑฐ๋ ์ค๋ฒ๋ผ์ด๋ ํด์ผํฉ๋๋ค.setNeedsUpdateConstraints, updateConstraintsIfNeeded
setNeedsLayout, layoutIfNeeded
setNeedsDisplay
์ ๋ฉ์๋๋ค์ ์ด๋ฆ์ด ๋น์ทํ ๊ฒ์ฒ๋ผ ๋์ ์ญ์ ๋น์ทํ๊ฒ ๋์ํฉ๋๋ค. ๊ทธ๋์ setNeedsLayout, layoutIfNeeded๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ช
๋๋ฆฌ๊ฒ ์ต๋๋ค.
setNeedsUpdateConstraints,setNeedsDisplay๋ ๋น์ทํ๊ฒ ๋์ํฉ๋๋ค.
func updateCircle(center: CGPoint, radius: CGFloat) {
self.center = center
self.radius = radius
setNeedsLayout() // ๋ ์ด์์ ์
๋ฐ์ดํธ ์์ฝ
setNeedsDisplay() // ๋ค์ ๊ทธ๋ฆฌ๊ธฐ ์์ฝ
}
updateConstraintsIfNeeded๋ ๋น์ทํ๊ฒ ๋์ํฉ๋๋ค.
UIView.animate(withDuration: 0.3) {
myView.frame.size = CGSize(width: 200, height: 200)
myView.layoutIfNeeded()
}
๋ทฐ๊ฐ ์ฌ๋ฌ๊ฐ ๊ฒน์ณ ์์ ๋, updateConstraints์ layoutSubviews์ ํธ์ถ ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
์คํ ๋ ์ด์์์ ํ์ ๋ทฐ โก๏ธ ์์ ๋ทฐ ์์๋ก, ๊ทธ ํ์ ย ๋ทฐ๋ค์ ๋ฐฐ์น๋ฅผ ์์ ๋ทฐ โก๏ธ ํ์ ๋ทฐย ์์๋ก ํ๊ฒ ๋ฉ๋๋ค. ์์ชฝ ๋ถํฐ ์ ์ฝ์กฐ๊ฑด์ ์ก์๊ฐ๊ณ , ๋ค์ ๋ฐ๊นฅ์ชฝ๋ถํฐ ์์น์ ์ฌ์ด์ฆ๋ฅผ ์ก์๊ฐ๋ ๊ฒ์ด์ฃ .
๊ทธ๋์ ์ ์ฒด์ ์ธ ํธ์ถ ์์๊ฐ ์ด๋ฐ์์ผ๋ก ์ผ์ด๋๊ฒ ๋ฉ๋๋ค.