Transform
์ด๋ ์ฃผ์ ๋ก ์ค๋ช
์ ํ๋ ค๋ค๋ณด๋ ๋์ถฉ ์๊ณ ์์์์ ์๊ฒ ๋์๋ค.
๊ทธ๋ฌ๋ค๋ณด๋ ์ฌ๊ธฐ์ ์๊ฐ๋ณด๋ค ์ค๋๊ฑธ๋ ธ๋ค
์๋ฌดํผ, Transform
์ด๋ ๋
์์ ๋ฐฐ์๋ณด์. ๋จ์ด๋ถํฐ ๋ณด์
Transform
- ๋ฐ๊พธ์ด ๋๋ค 2. ๋ณํ์ํค๋ค 3. ๋ง๋ค๋ค 4. ๋ณ๋ชจ์ํค๋ค 5. ๋ณํ์ํค๋ค
์ ๋ถ ๋ณํ์ ๊ดํ ์๊ธฐ๋ค.
์ดํ์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ๋ง์ด ๋์จ๋ค.
view.transform = ๋ธ๋ผ๋ธ๋ผ
๋ธ๋ผ๋ธ๋ผ ๋ถ๋ถ์ ๋ค์์ ์ค๋ช
ํ๊ณ ๊ทธ ์๋ง ๋ณด๋ฉด
โview
๋ฅผ ๋ณํ,๋ณ๊ฒฝ,๋ณ๋ชจ ์ํค๋ค.โ ๋ก ๋๊ฒ ์ง?
์์ด๊ถ์ ์ฝ๋ฉ์ด ์ฐธ ์ฌ์ธ๊ฑฐ ๊ฐ๋ค. ๋ถ๋ฝ๋ค
๋์ถฉ ๋ญ ํ๊ฒ ๋จ๊ฑด ์๊ฒ ๊ณ , ๋ฌด์์ ํ ์ ์๋์ง ๋ณด์.
- ํฌ๊ธฐ (Scale)
- ํ์ (Rotate)
- ์ขํ, ์์น (translation)
๋จ์ด๋ป๊ณผ ์์ฃผ ์ ๋ง๋ ์ญํ ๋ค์ ํ๋ค.
์๊ฐ์ ์ผ๋ก ํจ๊ณผ๋ฅผ ๋จผ์ ๋ณด์.
(Animation์ผ๋ก ํด์ผ ์ข๋ ์ดํดํ๊ธฐ ์ฌ์์ ์ด์ฉํ์์ผ๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉ๋์ง ์๋๋ค.)
์ฐจ๋ก๋๋ก ํฌ๊ธฐ, ํ์ , ์์น ๋ณ๊ฒฝ์ด๋ค.
(์ ์ผ ์๋ ์ค์์น๋ ํฌ๊ธฐ์ ์์น ๋๊ฐ์ง๋ฅผ ๋์์ ํจ๊ณผ๋ฅผ ์ฃผ๋ ์ค์์น๋ก ๋ค์ ๋์จ๋ค.)
๊ทผ๋ฐ, ํฌ๊ธฐ๋ฅผ ๋ฐ๊พธ๋๊ฒ์ ์ ์ฌํ ๋ณด๋ฉด ํน์ดํ ์ ์ด ์๋ค.
์์ ํ์์ ์์ ์ฌ๊ฐํ์ด ์๋๋ฐ, ์ด ๋
์๋ ๊ฐ์ด ์ปค์ง๋ค.
๊ทธ๋ผ ํ
์คํธ๋ฅผ ๋ฃ๊ณ ์ด๋ฒ์ ์ค์์น๋ฅผ ํค๋ฉด ๊ฐ๋ก ์ฌ์ด์ฆ๋ ์์์ง๊ฒ ํ์๊ณ ์ธ๋ก๋ ๋์ผํ๋ค.
์์ ๊ฐ์ด ํ
์คํธ ์ธ๋ก๋ก ๋์ด๋๊ณ , ๊ฐ๋ก๋ ์ค์ด ๋ค์๋ค.
๋ง์น ์ ์์ฒด๊ฐ ์ด๋ฏธ์ง์๋๊ฒ์ฒ๋ผ ๋ณํํ์๋ค.
Transform
์ด๋ ๋
์์ ํ์
์ CGAffineTransform
์ด๋ค.
๊ทธ๋ผ ์ด ๋ ์์ ๋ํ ๋ฌธ์๋ฅผ ๋ณด์
์.. ์์ธํ๊ฑด ๊ฐ์ ๋ณด๋๋ก ํ์โฆ. ๋งํฌ๋ ์ฌ๊ธฐ..
์ฌ๊ธฐ์ CGAffineTransform
์ด๋ ๋จ์ด ์๋ ๋ฌธ๊ตฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
An affine transformation matrix for use in drawing 2D graphics
์ํ ํ๋ ฌ์ด ๋ญ์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค๋ง ๋ค์ 2D graphics๋ฅผ ๋ณด๋ Frame์ ๋ฐ๊พธ๊ณ ๊ทธ๋ฐ๊ฒ ์๋๋ผ
๊ทธ๋ํฝ์ ์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ฐฉ์์ธ๊ฐ๋ณด๋ค.
์ด๋ฌํ ๋ฐฉ์์ด๋ค๋ณด๋, ๋จ์ ๋ํ์ด ์๋๋ผ๋ฉด ํจ๊ณผ๋ฅผ ์ค๋ ์ฃผ์๋ฅผ ํด์ผํ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ ๋ด ์ด์ ์ฌ์ฉ๋ฒ์ ๋ํด ์์๋ณด์
(์ค์์น 4๊ฐ๋ฅผ ๋ชจ๋ ํ๋์ IBAction
ํจ์์ ์ฐ๊ฒฐ ์์ผฐ๊ณ ๊ทธ ํจ์์ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค)
// 1. ์ ์ธ
var transform: CGAffineTransform?
// sender = ์ค์์น / ์ค์์น ์ข
๋ฅ์ ๋ฐ๋ฅธ Switch๋ฌธ
switch sender {
case scaleSwitch:
// 2-1. ์ด๊ธฐํ(ํฌ๊ธฐ)
transform = CGAffineTransform(scaleX: 0.5, y: 2)
case rotateSwitch:
// 2-2. ์ด๊ธฐํ(ํ์ )
transform = CGAffineTransform(rotationAngle: .pi)
case translationSwitch:
// 2-3. ์ด๊ธฐํ(์์น)
transform = CGAffineTransform(translationX: 0, y: -100)
case complexSwitch:
// 2-4. ์ด๊ธฐํ(ํฌ๊ธฐ & ์์น)
transform = CGAffineTransform(scaleX: 2, y: 2).translatedBy(x: 0, y: -100)
default:
return
}
// ์ ๋๋ฉ์ด์
ํจ๊ณผ
UIView.animate(withDuration: 0.3) {
// 3. ์ ์ฉ
self.justView.transform = transform!
}
๊ต์ฅํ ๋จ์ ํ๋ค.
ํ๋์ฉ ๋ด
์๋ค. (์ธ์๋ค์ ๋ชจ๋ CGFloat
ํ์
)
ํฌ๊ธฐ
transform = CGAffineTransform(scaleX: 2, y: 2)
์ํ๋ ๋ฐฐ์จ์ ์ ์ด์ฃผ๋ฉด ๋๋ค. ๊ฐ๋ก๋ก ๋ช๋ฐฐ, ์ธ๋ก๋ก ๋ช๋ฐฐ. ์ฝ๋ค.
ํ์
transform = CGAffineTransform(rotationAngle: .pi)
์ํ๋ ํ์ ๊ฐ์ ์ ์ด์ฃผ๋ฉด ๋๋ค. .pi
, .pi / 4
๋ฑ๋ฑ ์ํ๋๋๋ก!
์์น
transform = CGAffineTransform(translationX: 0, y: -100)
translation
์ ๋ณํ์ธ๊ฑฐ ๊ฐ์๋ฐ,,
์์งํ ๋ค๋ฅธ๊ฒ์ฒ๋ผ ํ ์๋ฟ์ง ์๋๋ค.
๋ฃ๋ x,y ๊ฐ๋งํผ ๊ธฐ์กด ๊ฐ์ ๋ํด์ง๊ฒ ๋๋ค.
์ฌ๊ธฐ์ x๋ 0, y๋ -100 ํ๊ธฐ ๋๋ฌธ์, ๊ฐ๋ก์ถ ์ด๋์ ์๊ณ ์ธ๋ก์ถ์ ์์ชฝ์ผ๋ก 100๋งํผ ์ด๋ํ์๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ๋ทฐ์ transform
์ ์ ์ฉํด ์ฃผ๋ฉด ๋๋ค.
์์ ๋ณต๊ตฌ
์ ์ฉํ์ผ๋ ๋๋๋ฆฌ๋๊ฒ๋ ํ์ํ๊ฑด ๋น์ฐ
์์ฃผ ๊ฐ๋จํ๋ค.
self.justView.transform = CGAffineTransform.identity
// or
self.justView.transform = .identity
(ํน์ ๋๊ตฐ๊ฐ ๋ณธ๋ค๋ฉด, ์๋ ์ฃผ์ ๊ผญ ๋ณด์๊ธธ)
๋๊ฐ์ง ์ด์์ ์กฐํฉ์ ์ํ ๋ ์ด๋ป๊ฒ ํ ๊น?
์๋ฅผ ๋ค์ด, ์์น๊ฐ ์ด๋ํ๋ฉด์ ํฌ๊ธฐ์ ๋ณํ๋ฅผ ์ฃผ๊ณ ์ถ๋ค๋ฉด?
ํน์ ํ์ ํ๋ฉด์ ํฌ๊ธฐ ๋ณํ๋ ๊ฐ์ด ์ฃผ๊ณ ์ถ๋ค.
๊ทธ๋ผ ์์ ์ฝ๋ 2-4 ๋ถ๋ถ์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์์๋ค.
// 2-4. ์ด๊ธฐํ(ํฌ๊ธฐ & ์์น)
transform = CGAffineTransform(scaleX: 2, y: 2).translatedBy(x: 0, y: -100)
๋ฑ๋ณด๋ฉด ๋๊ฐ ๋ด๋ ํฌ๊ธฐ
์ ๋ํด ๋ณํ๋ ์ฃผ๊ณ , ์์น
๊ฐ๋ ์กฐ์ ํ๊ฒ ์๊ฒผ๋ค.
์์ gif์ ์๋ต๋ ๋ง์ง๋ง 4๋ฒ์งธ ์ค์์น์ ๋ํ ๋์์ ๋ณด์.
์์ ์งค๊ณผ ๊ฐ์ด ํฌ๊ธฐ(scale
)๋ณํ๊ฐ ์์ผ๋ฉด์ ์์น(translate
)์ ๋ํ ๋ณํ๋ ์๋ค.
์ ๊ธฐ์ ๋์ด์๋๋ผ ํ์ ๋ ๊ฐ์ ธ๋ค ๋ถ์ฌ์ค ์ ์๋ค.
Q.์ด๋ฏธ Scale์ด ์๋๋ฐ, Scale์ ํ๋ฒ๋ ๋ถ์ด๋ฉด ์ด๋ป๊ฒ ๋๋?
A. scale์ด ๋๋ค ์๋จนํ๋๋ ์๊ณ ๋ง์ง๋ง๋ง ๋จนํ๋๋ ์๊ณ ์ค๊ตฌ ๋๋ฐฉ์ด์๋ค.
์ฃผ์!!
์ฐ๋ค๊ฐ ๋ฐ๊ฒฌํ๋๋ฐ, ์๋ ์ฌํ ๋ถ๋ถ๊ธ ์ฐ๋ค๋ณด๋ ์๋ชป ์ดํดํ๊ฒ ์์๋ค.
์๋ ๋ณด๋ฉด ์๊ฒ ์ง๋ง, ํ๋ ฌ ๊ณฑ์
์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋๊ฐ์ ์์๊ฐ ๋ฐ๋๋ฉด ์์์น๋ ๋ฌ๋ผ์ง๋ค.
A * B์,,, B * A๋ ๋ค๋ฅด๋คโฆ.. ๋ ์์ธํ๊ฑด ์๋์.
์ด์ง ์ฌํ
(๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ ์๊ฐ ์ ๋ถ. ์๋๋ ์์ฃผ ์์ฃผ ์ด์ง ์ฌํ๋๊น? ..)
์ Transform
์ด๋ ์์ด๋ฅผ ์ฝ์์ ์ฐ์ด๋ณด๋ฉด ์ด๋ป๊ฒ ๋์ฌ๊น?
๋จผ์ ์์ ๋ณต๊ตฌ ๊ฐ์ธ .identity
์ถ๋ ฅ ๊ฐ์ ๋ณด์
CGAffineTransform(a: 1.0, b: 0.0, c: 0.0, d: 1.0, tx: 0.0, ty: 0.0)
์ a
,b
๋ 1์ด๊ณ ๋๋จธ์ง 0์ด ๊ธฐ๋ณธ์ด๋๊ฑธ ์ ์ ์๋ค.
์์ switch
๋ฌธ์ ์๋ ์ ๋ค์ ๊ฐ๊ฐ ์ฐ์ด๋ณด์. ์๋ ์ฝ๋์ฒ๋ผ.
// 1. ์ ์ธ
var transform: CGAffineTransform?
switch sender {
case scaleSwitch:
// 2-1. ์ด๊ธฐํ(ํฌ๊ธฐ)
transform = CGAffineTransform(scaleX: 2, y: 2)
case rotateSwitch:
// 2-2. ์ด๊ธฐํ(ํ์ )
transform = CGAffineTransform(rotationAngle: .pi)
case translationSwitch:
// 2-3. ์ด๊ธฐํ(์์น)
transform = CGAffineTransform(translationX: 0, y: -100)
case complexSwitch:
// 2-4. ์ด๊ธฐํ(ํฌ๊ธฐ & ์์น)
transform = CGAffineTransform(scaleX: 2, y: 2).translatedBy(x: 0, y: -100)
default:
return
}
// 3. ์ถ๋ ฅ
print(transform!)
3์ ๋ณด๋ฉด transform์ด๋ ๊ฒ์ ๋ํด ์ถ๋ ฅ์ด ์ถ๊ฐ ๋์๋ค.( ์ด์๊ฒ ์ถ๋ ฅํ๊ธฐ ์ํด ๊ฐ์ ํด์ !
)
// 1. ํฌ๊ธฐ
CGAffineTransform(a: 2.0, b: 0.0, c: 0.0, d: 2.0, tx: 0.0, ty: 0.0)
// 2. ํ์
CGAffineTransform(a: -1.0, b: 1.2246467991473532e-16, c: -1.2246467991473532e-16, d: -1.0, tx: 0.0, ty: 0.0)
// 3. ์์น
CGAffineTransform(a: 1.0, b: 0.0, c: 0.0, d: 1.0, tx: 0.0, ty: -100.0)
// 4. ํฌ๊ธฐ & ์์น
CGAffineTransform(a: 2.0, b: 0.0, c: 0.0, d: 2.0, tx: 0.0, ty: -200.0)
a
,b
,c
,d
,tx
,ty
๋ฌธ์์์ ์ผํ ๋ณธ๋ฏ ํ์ฌ ๋ฌธ์๋ฅผ ๋ค์ ๋ณด์๋ค.
Transform
๊ทธ๋ํฝ์ ์ผ๋ก ํํํ๋๊ตฌ๋ ํ์์๊ณ , ์ด๋ 3x3 ํ๋ ฌ๋ก ๋ณด์ฌ์ฃผ๋ ํ์์ด์๋ค.
๊ทผ๋ฐ ์๋ซ์ค์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ํ์๋ค.
3๋ฒ์งธ ์ปฌ๋ผ์ ํญ์ (0,0,1)์ด๋ค. ๊ณ ๋ก CGAffineTransform์ 1์ด๊ณผ 2์ด์ ๋ํ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค.
๊ทธ๋ ๋ค ํ๋ค.
๊ทธ๋ ์ง๋ง ์ํํ๋ ฌ์ ๋ํด์ ๊ณต๋ถํ๊ธฐ์,,, ใ
์ด ๋ฌธ์๋ก๋ง ์ดํดํด๋ณด์
์์ ๊ฐ์ด ์ด๋ฏธ์ง ๊ฐ์ ํ์์ผ๋ก ๊ฐ๊ฐ ์ด๊ธฐํํ๊ฒ ๋๋ค.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์์ ๋์จ๊ฒ ์ฒ๋ผ a
,b
,c
,d
,tx
,ty
์ด๋ฉฐ,
์ด๊ฑด ํ์์ฒ๋ผ ์ด๋ ต๊ฒ ์๊ฐํ๋ ์ฝ๊ฒ ์ฐ๋ผ๊ณ
scale
, rotationAngle
, translation
์ ์ด์ฉํ์ฌ ์ฌ์ฉ์ฑ์ ๋ํ๋ฏ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋๊ฐ์ง๋ฅผ ์ด์ฉํ 4๋ฅผ ๋ณด๋ฉด, ์ ๊ฐ์ (์์น ํ๋ ฌ x ํฌ๊ธฐ ํ๋ ฌ)๊ณผ ๊ฐ๋ค.
ํ.. ์๋ด์ผํ๋ค..
2-4์ ์์๊ฐ scale
, translate
๋ผ์
๋น์ฐํ scale
x translate
์ธ์ค ์์๋๋ง
translate
x scale
์ด์๋คโฆ.
A * B์ B * A๋ ๋ค๋ฅด๋โฆ.. ์ฌ์ฉ์ ๊ต์ฅํ ์ฃผ์๋ฐ๋
(A: scale
B: translation
)
์๋๋ -100 ์ด์์ง๋ง -200์ ํด๋น๋๋ ์ด๋์ ํ๊ฒ๋๋ค. ์กฐ์ฌ๋ฐ๋โฆ.
-100 ๋งํผ ์ด๋ํ๊ณ 2๋ฐฐ๋ก ํค์ฐ๊ณ ์ถ์๋ค๋ฉด ์๋ O ๋ถ๋ถ์ฒ๋ผ ํด์ผํ๋ค.
// X
transform = CGAffineTransform(scaleX: 2, y: 2).translatedBy(x: 0, y: -100)
// O
transform = CGAffineTransform(translationX: 0, y: -100).scaledBy(x: 2, y: 2)
์ ๋ถ๋ถ์ ์ค์ผ์ผ๋ ๋๋ฐฐ๋งํผ ์ด๋ํ๋๋ณด๋คโฆ
B * A๋ ๋ค์๊ณผ ๊ฐ๋ค.
- a = 2 x 1
- d = 2 x 1
- tx = 0 x 1
- ty = -100 x 2
(a: 2.0, b: 0.0, c: 0.0, d: 2.0, tx: 0.0, ty: -200.0)
์ด๋ ๊ฒ ์ ์๊ฐ ๋๋ค. ์์ 4๋ฒ๊ณผ ์ผ์น
์ด๊ฒ์ ์ ๋ง ์ ์ดํดํ๋ค๋ฉด, ๋ฉ์ง๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฒ ๊ฐ๋ค.
ํ ์์ ์ ๋๋์ฒด ๋ช๋ฒ์ ํ๊ฑด์งโฆ. ๋ช์๊ฐ์ด๋ฉฐ ๋๋ ์ค ์์๋ ๋ด์ฉ์ด ์ญ๋๊ธ์ผ๋ก ์ค๋ ๊ฑธ๋ฆฐ๋ฏํ๋ค.