Jiseob Kim

iOS Developer

Swift - DragAnimation(2/3) - Transform

25 Mar 2020 » Swift, UI

Transform ์ด๋ž€ ์ฃผ์ œ๋กœ ์„ค๋ช…์„ ํ•˜๋ ค๋‹ค๋ณด๋‹ˆ ๋Œ€์ถฉ ์•Œ๊ณ  ์žˆ์—ˆ์Œ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ์—ฌ๊ธฐ์„œ ์ƒ๊ฐ๋ณด๋‹ค ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค

์•„๋ฌดํŠผ, Transform์ด๋ž€ ๋…€์„์„ ๋ฐฐ์›Œ๋ณด์ž. ๋‹จ์–ด๋ถ€ํ„ฐ ๋ณด์ž

Transform

  1. ๋ฐ”๊พธ์–ด ๋†“๋‹ค 2. ๋ณ€ํ™”์‹œํ‚ค๋‹ค 3. ๋งŒ๋“ค๋‹ค 4. ๋ณ€๋ชจ์‹œํ‚ค๋‹ค 5. ๋ณ€ํ˜•์‹œํ‚ค๋‹ค

์ „๋ถ€ ๋ณ€ํ™”์— ๊ด€ํ•œ ์–˜๊ธฐ๋‹ค.

์ดํ›„์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ๋‚˜์˜จ๋‹ค.

view.transform = ๋ธ”๋ผ๋ธ”๋ผ

๋ธ”๋ผ๋ธ”๋ผ ๋ถ€๋ถ„์€ ๋’ค์—์„œ ์„ค๋ช…ํ•˜๊ณ  ๊ทธ ์•ž๋งŒ ๋ณด๋ฉด
โ€œview๋ฅผ ๋ณ€ํ™”,๋ณ€๊ฒฝ,๋ณ€๋ชจ ์‹œํ‚ค๋‹ค.โ€ ๋กœ ๋˜๊ฒ ์ง€?
์˜์–ด๊ถŒ์€ ์ฝ”๋”ฉ์ด ์ฐธ ์‰ฌ์šธ๊ฑฐ ๊ฐ™๋‹ค. ๋ถ€๋Ÿฝ๋‹ค

๋Œ€์ถฉ ๋ญ˜ ํ•˜๊ฒ ๋‹จ๊ฑด ์•Œ๊ฒ ๊ณ , ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์ž.

  1. ํฌ๊ธฐ (Scale)
  2. ํšŒ์ „ (Rotate)
  3. ์ขŒํ‘œ, ์œ„์น˜ (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๋ฒˆ๊ณผ ์ผ์น˜

์ด๊ฒƒ์„ ์ •๋ง ์ž˜ ์ดํ•ดํ•œ๋‹ค๋ฉด, ๋ฉ‹์ง€๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™๋‹ค.

ํ•˜ ์ˆ˜์ •์„ ๋„๋Œ€์ฒด ๋ช‡๋ฒˆ์„ ํ•œ๊ฑด์ง€โ€ฆ. ๋ช‡์‹œ๊ฐ„์ด๋ฉฐ ๋๋‚ ์ค„ ์•Œ์•˜๋˜ ๋‚ด์šฉ์ด ์—ญ๋Œ€๊ธ‰์œผ๋กœ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋“ฏํ•˜๋‹ค.

๋.