Jiseob Kim

iOS Developer

Swift - DragAnimation(1/3) - Gesture(Long &pan)

01 Mar 2020 » Swift, UI

์˜ค๋žซ๋งŒ์— ํฌ์ŠคํŒ…โ€ฆโ€ฆโ€ฆโ€ฆ. ์—ฌ๋Ÿฌ๋ชจ๋กœ ํž˜๋“  ์‹œ๊ธฐ์˜€๋‹ค ใ…  ๊ธฐ์šด๋‚ด์ž

๊ฐœ์ธ์ ์œผ๋กœ๋Š” iOS์˜ ์žฅ์ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ถ€๋“œ๋Ÿฌ์šด ๋™์ž‘์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐœ์ธ์ ์œผ๋ก  ์›น๋ทฐ๋ฅผ ์„ ํ˜ธํ•˜์ง€ ์•Š๋Š” ์ด์œ ์ค‘ ํ•˜๋‚˜๋Š” ์›น๋ทฐ๋กœ๋„ ๋™์ž‘์ด ๋ถ€๋“œ๋Ÿฌ์šธ์ˆ˜๋Š” ์žˆ์œผ๋‚˜,

๋„ค์ดํ‹ฐ๋ธŒ์˜ ๋ถ€๋“œ๋Ÿฌ์›€์„ ๋”ฐ๋ผ๊ฐ€๋Š” ์•ฑ์€ ๋ณด์ง€ ๋ชปํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ถ€๋“œ๋Ÿฌ์šด ๋™์ž‘๊ณผ ์ž˜ ๋งž๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์— ๋” ๊ด€์‹ฌ์„ ๊ฐ–๊ฒŒ ํ•ด์ฃผ๊ณ , ์ข‹์€ ๊ฒฝํ—˜(UX)๋ฅผ ์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

ํ™”๋ฉด ํ•˜๋‚˜๋ฅผ ๋„์šธ๋•Œ๋„ ๋‹จ์ˆœํžˆ ๋ณด์—ฌ์ฃผ๋Š”๊ฒŒ ์•„๋‹Œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์ข‹์€ ๊ฒฝํ—˜์„ ์œ ์ €์—๊ฒŒ ์„ ์‚ฌํ•  ์ˆ˜ ์žˆ์„์ง€

๊ณ ๋ฏผํ•˜๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ข‹์€๊ฒƒ ๊ฐ™๋‹ค.


๊ทธ๋ž˜์„œ ์‹œ๋„ํ•œ UI ๋”ฐ๋ผํ•˜๊ธฐ!

๋ช‡๋ช‡ ์•ฑ๋“ค๋ณด๋ฉด ํŠน์ • UIView ๋˜๋Š” UIButton ๋“ฑ์„ ๊ธธ๊ฒŒ ๋ˆ„๋ฅด๋ฉด ์ด๋™ ์‹œํ‚ค๊ณ ,
๋‹ค๋ฅธ ๋ทฐ ์œ„์— ์˜ฌ๋ฆด์‹œ ์ƒˆ๋กœ์šด ์•ก์…˜์ด ์ผ์–ด๋‚จ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์•ฑ๋“ค์ด ์žˆ์—ˆ๋‹ค.

์ด๋Ÿฐ ์•ฑ๋“ค ๋ณด๋ฉด์„œ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ €๋ ‡๊ฒŒ ๋ ๊นŒ? ๋ผ๋Š” ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ ์‹œ๋„๋ฅผ ํ•ด๋ณด์•˜๋‹ค.


์ด๋ฒˆ ํŽธ์€ 3ํŽธ์œผ๋กœ ์ด๋ฃจ์–ด์งˆ๊ฒƒ์ด๊ณ , ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Gesture - Long Press
  2. Transform
  3. ์‘์šฉํ•˜๊ธฐ (1 + 2)


๋ฌด์—‡์„ ๋งŒ๋“ค๊ฒŒ ๋ ์ง€ ๊ฒฐ๊ณผ๋ฌผ๋ถ€ํ„ฐ ๋ณด๊ณ  ์ด์•ผ๊ธฐ๋ฅผ ์ง„ํ–‰ํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.


์•„์•„โ€ฆ ํ…Œ๋งˆ ๋ฐ”๊พธ๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๋กœ์ปฌ์—์„œ ๋ชป๋ถˆ๋Ÿฌ์„œ ํ‘ธ์‹œํ•˜๊ณ  ํ™•์ธํ•˜๋Š”๊ฒƒ ๋ฐ˜๋ณตํ•˜๋‹ค ์ด๊ฑด ์•„๋‹ˆ๋‹ค ์‹ถ์–ด์„œ ๋กœ์ปฌ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ๋” ํ•˜๋Š”๋ฐ, ์‚ฝ์งˆ์„ ๋„ˆ๋ฌด ๋งŽ์ด ํ–ˆ๋‹คโ€ฆ.. ๊ทธ๊ฑด ์„ฑ๊ณตํ–ˆ๋Š”๋ฐ, ์ด๋ฏธ์ง€ ์™œ์ผ€ ํฌ๋‹ˆ?โ€ฆ. ๋‚ด์ผ ์ด์–ด์„œ ์ ์–ด์•ผ๊ฒ ๋‹ค.


์œ„์— gif ํŒŒ์ผ์„ ๋ณด๋ฉด ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์Šคํฌ๋กค๋ทฐ์ด๋ฉฐ ์œ„ ์•„๋ž˜ ์Šคํฌ๋กค์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  2. ๋กฑํ„ฐ์น˜์‹œ ํ„ฐ์น˜๋œ ๋ทฐ์˜ Frame๊ณผ Alpha๊ฐ’์ด ๋ณ€ํ™”ํ•˜๋ฉฐ ํด๋ฆญ(ํ„ฐ์น˜)ํ•œ์ฑ„๋กœ ์›€์ง์ด๋ฉด ๋”ฐ๋ผ ์›€์ง์ธ๋‹ค.
  3. 2์˜ ์ƒํƒœ๋กœ ๊ฐ€์šด๋ฐ ์‚ฌ๊ฐํ˜•์˜ ์˜์—ญ์— ๋“ค์–ด๊ฐ€๋ฉด ๊ฐ€์šด๋ฐ ์‚ฌ๊ฐํ˜•์ด ๋ฐ˜์‘์„ ํ•œ๋‹ค.


์ด์™€ ๊ฐ™์€ ์ ์ด ๋‹ค๋ฅธ ์œ ๋ช… ์•ฑ๋“ค์—์„œ ๋ณด์ด๋Š” ์•ก์…˜๋“ค์ด์—ˆ๋‹ค. ๊ทธ๋ ‡๋‹ด ์œ„์™€ ๊ฐ™์€ ์•ก์…˜์—์„œ ์ฃผ๋ชฉํ•ด์•ผํ•  ์ ์€ ๋ฌด์—‡์ผ๊นŒ?

  1. ์Šคํฌ๋กค๋ทฐ์ด๋ฉฐ ์œ„ ์•„๋ž˜ ์Šคํฌ๋กค์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    ๋กฑํ„ฐ์น˜ ํ›„์— ์œ„์•„๋ž˜ ์›€์ง์ด๋Š” ๊ฒƒ๊ณผ ์Šคํฌ๋กค๋ทฐ์˜ ํ„ฐ์น˜ํ›„ ์œ„์•„๋ž˜ ์›€์ง์ด๋Š”๊ฒƒ์˜ ๊ตฌ๋ถ„์ด ํ•„์š”ํ•˜๋‹ค. (์‰ฝ๊ฒŒ ๋งํ•ด ํ„ฐ์น˜๋œ ํ›„ ์œ„์•„๋ž˜๋กœ ์›€์ง์ด๋Š”๋ฐ ์Šคํฌ๋กค๋ทฐ๋„ ์œ„์•„๋ž˜๋กœ ์›€์ง์ด๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๋œป)

  2. ๋กฑํ„ฐ์น˜์‹œ ํ„ฐ์น˜๋œ ๋ทฐ์˜ Frame๊ณผ Alpha๊ฐ’์ด ๋ณ€ํ™”ํ•˜๋ฉฐ ํด๋ฆญ(ํ„ฐ์น˜)ํ•œ์ฑ„๋กœ ์›€์ง์ด๋ฉด ๋”ฐ๋ผ ์›€์ง์ธ๋‹ค.

    ๋กฑํ„ฐ์น˜ ํ›„ Frame๊ณผ Alpha๊ฐ’์— ๋ณ€ํ™”๋ฅผ ์ฃผ๊ณ  ๋“œ๋ž˜๊ทธ์— ๋”ฐ๋ผ๊ฐ€๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

  3. 2์˜ ์ƒํƒœ๋กœ ๊ฐ€์šด๋ฐ ์‚ฌ๊ฐํ˜•์˜ ์˜์—ญ์— ๋“ค์–ด๊ฐ€๋ฉด ๊ฐ€์šด๋ฐ ์‚ฌ๊ฐํ˜•์ด ๋ฐ˜์‘์„ ํ•œ๋‹ค.

    ์‚ฌ๊ฐํ˜• ์•ˆ์— ๋“ค์–ด๊ฐ”์„๋•Œ ์‚ฌ๊ฐํ˜•์ด ๋ฐ˜์‘ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด, ํ˜„์žฌ ํ„ฐ์น˜๋œ ์ •ํ™•ํ•œ ์œ„์น˜ ์ •๋ณด๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.


์ฃผ์˜:

์ด ์‹œ๋ฆฌ์ฆˆ์—์„  ์Šคํฌ๋กค๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ ์šฉํ•˜๋Š” ๋ฒ•์€ ๋”ฐ๋กœ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค.
ํ•„์ž๋Š” ์Šคํฌ๋กค ๋ทฐ ์•ˆ์— ์Šคํƒ๋ทฐ๋ฅผ ๋„ฃ๊ณ  ์ฝ”๋“œ๋กœ ๋ทฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ˜•์‹์„ ์ด์šฉํ•˜์˜€๊ธฐ์— gif ํ•˜๋‹จ์— Add์™€ Clear๋ฒ„ํŠผ์ด ์กด์žฌ


๊ทธ๋ž˜์„œ ๊ธ€์˜ ๋„์ž…๋ถ€์™€ ๊ฐ™์ด 3๊ฐ€์ง€๋กœ ํฌ์ŠคํŒ…์„ ๋‚˜๋ˆ ์„œ ์ง„ํ–‰!

์ด ๊ธ€์—์„  ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฌ์šด ์ œ์Šค์ณ์— ๊ด€ํ•ด์„œ ๊ธ€์„ ์ ์–ด๋ณธ๋‹ค.



Gesture?

์ œ์Šค์ฒ˜๋ž€ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ํ•œ๊ธ€๋กœ ์–˜๊ธฐํ•˜๋ฉด ๋™์ž‘์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ด ์•ฑ์—์„œ ๋™์ž‘์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ? ์‚ฌ์šฉ์ž์˜ ์•ก์…˜์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ œ์Šค์ณ๋Š” ํ„ฐ์น˜๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ ์•ฑ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด์•ผํ•  ์•ก์…˜์€ ํ„ฐ์น˜์ผ ๊ฒƒ์ด๋‹ค.

๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํ™”๋ฉด์œผ๋กœ ์ด๋™์„ ํ•ด์•ผํ•˜๊ณ , ์›ํ•˜๋Š” ์•„์ดํ…œ์„ ์„ ํƒํ•ด์•ผํ•˜๊ณ ,
๊ทธ ์•„์ดํ…œ์„ ์‚ญ์ œํ•˜๋˜ ์ถ”๊ฐ€ํ•˜๋˜ ์ €์žฅํ•˜๋˜ ์›ํ•˜๋Š”๊ฒƒ์„ ํ•˜๋ ค๋ฉด ๊ทธ์— ํ•ด๋‹น๋˜๋Š” ๊ฒƒ์„ ๋ˆŒ๋Ÿฌ์•ผํ•œ๋‹ค.

์ด์™€ ๊ฐ™์ด ๋ˆ„๋ฅด๋Š” ํ–‰์œ„๊ฐ€ ํ•˜๋‚˜์˜ ์ œ์Šค์ณ์ด๋‹ค.
์ด ํ„ฐ์น˜ ์™ธ์—” ๋ฌด์—‡์ด ์žˆ์„๊นŒ

  • ๋“œ๋ž˜๊ทธ(๋‘์†๊ฐ€๋ฝ ํ„ฐ์น˜,์„ธ์†๊ฐ€๋ฝ, ๋„ค์†๊ฐ€๋ฝโ€ฆ)
  • ๋กฑํ„ฐ์น˜
  • ์Šค์™€์ดํ”„
  • ํ•€์น˜ ํˆฌ ์คŒ



์ง€๊ธˆ์€ ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ์ƒ๊ฐ๋‚œ๋‹ค..
๋ญ ์•„๋ฌดํŠผ ์ด๋Ÿฐ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ๋กฑํ„ฐ์น˜ ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.
์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ํ•„์š”ํ•œ ๋‚ด์šฉ๋งŒ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์”์‹œ๋‹ค. ์ฝ๊ธฐ ์‰ฝ๊ฒŒ.




Long Press Gestrue (๋กฑํ„ฐ์น˜)

๋กฑ ํ”„๋ ˆ์Šค๋Š” ๋ญ”๊ฐ€ ๊ฑฐ๋ถ€๊ฐ์ด ๋“œ๋‹ˆ ๋กฑํ„ฐ์น˜๋ผ๊ณ  ํ•˜๊ฒ ๋‹ค.

์ผ๋‹จ ์ ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ถ€ํ„ฐ ๋ณด์ž

// Long Press Gesture - ์„ ์–ธ
let longTouchGesture = UILongPressGestureRecognizer(target: self, action: #selector(longTouchAction(_:)))

๋’ท๋ถ€๋ถ„์ด ์–ด๋””์„œ ๋งŽ์ด ๋ณธ๊ฑฐ ๊ฐ™๋‹ค. ๋ฒ„ํŠผ์— ์•ก์…˜ ๋„ฃ์„๋•Œ ๋งŽ์ด ๋ดค์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธ์ž๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํƒ€๊ฒŸ: ๋กฑํ„ฐ์น˜ ํ–ˆ์„ ๋•Œ, ์–ด๋””์„œ ์ฒ˜๋ฆฌํ• ๊ฑฐ์•ผ?
์•ก์…˜: ๋กฑํ„ฐ์น˜ ํ–ˆ์„ ๋•Œ, ๋ฌด์Šจ ์ฒ˜๋ฆฌํ• ๋ž˜?


์ด๊ฑด ์ œ์Šค์ณ์— ๋Œ€ํ•œ ์ •์˜๋งŒ ๋œ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ด ์ด ์ œ์Šค์ณ๋ฅผ ์–ด๋”˜๊ฐ€์— ์ ์šฉ์„ ์‹œ์ผœ์ค˜์•ผ๊ฒ ์ง€?

// Long Press Gesture - ์ ์šฉ
view.addGestureRecognizer(panGestrue)

๋‹ค์‹œ๋งํ•ด ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
view๋ฅผ ๋กฑํ„ฐ์น˜ ํ–ˆ์„ ๋•Œ, self์— ์žˆ๋Š” longTouchAction(_:) ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์ž~


๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ longTouchAction์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

@objc
func longTouchAction(_ recognizer: UILongPressGestureRecognizer) {
    print(recognizer.state.rawValue)
}

@objc๋Š” selector์—๋‹ค ์จ์ฃผ๋ ค๋ฉด ์จ์•ผํ•˜๊ณ ,
recognizer๋ผ๋Š” ์• ๊ฐ€ ์ œ์Šค์ณ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค


์ด๋ฅผ ํ†ตํ•ด ๋งŽ์€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” .state์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

๊ทธ๋ ‡๋‹ค enum์ด๊ณ  ์ž๋ฃŒํ˜•์€ Int์ด๋‹ค. ๊ทธ๋ ‡๋‹จ๊ฑด switch๋ž‘ ๊ถํ•ฉ์ด ์ž˜ ๋งž๊ฒ ๋‹ค๋Š” ๋ง~


๊ทธ๋Ÿผ enum์ด๋‹ˆ ์ข…๋ฅ˜๋ฅผ ํ•œ๋ฒˆ ๋ณด์ž.

๋ญ๊ฐ€ ๋งŽ๋‹ค. ์„ธ๋ถ„ํ™”ํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทผ๋ฐ ์ด ๊ธ€์—์„  ๋กฑํ„ฐ์น˜์˜ ์‹œ์ž‘, ์ข…๋ฃŒ, ๋ณ€ํ™”์— ๋Œ€ํ•ด์„œ ์•Œ๋ฉด ๋œ๋‹ค.

๋‹ค์‹œ๋งํ•ด .began๊ณผ .ended ๊ทธ๋ฆฌ๊ณ  .changed๋งŒ ์•Œ๋ฉด ๋œ๋‹ค.


์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

@objc
func longTouchAction(_ recognizer: UILongPressGestureRecognizer) {
    switch recognizer.state {
    case .began:
        // ๋กฑํ„ฐ์น˜ ์‹œ์ž‘
        break
    case .ended:
        // ๋กฑํ„ฐ์น˜ ์ข…๋ฃŒ
        break
    case .changed:
        // ํ„ฐ์น˜ ํ›„ ๋ณ€ํ™”
        // 1
        let point: CGPoint = recognizer.location(in: self.view)
        // 2
        let point2: CGPoint = recognizer.location(in: self.longTouchView)
    default:
        // ๋‚˜๋จธ์ง€ ๋ถˆํ•„์š”
        break
    }
}

.began
๋กฑํ”„๋ ˆ์Šค๊ฐ€ ์‹œ์ž‘ ๋๋‹ค๋ฅผ ์•Œ๋ ค์ค€๋‹ค.

.ended
๋กฑํ”„๋ ˆ์Šค๊ฐ€ ๋๋‚ฌ๋‹ค๋ฅผ ์•Œ๋ ค์ค€๋‹ค.

.changed
์–˜๋ฅผ ์ฃผ๋ชฉํ•˜์ž,


์ € location(in:_)์ด ๋ฌด์—‡์ด๋ƒ ํ•˜๋ฉด, ๋ฌธ์„œ์ƒ ์ด๋ ‡๊ฒŒ ์จ์žˆ๋‹ค.

Summary
Returns the point computed as the location in a given view of the gesture represented by the receiver.

Declaration
func location(in view: UIView?) -> CGPoint

Discussion
The returned value is a generic single-point location for the gesture computed by the UIKit framework. It is usually the centroid of the touches involved in the gesture. For objects of the UISwipeGestureRecognizer and UITapGestureRecognizer classes, the location returned by this method has a significance special to the gesture. This significance is documented in the reference for those classes.

Parameters
view
A UIView object on which the gesture took place. Specify nil to indicate the window.

Returns
A point in the local coordinate system of view that identifies the location of the gesture. If nil is specified for view, the method returns the gesture location in the windowโ€™s base coordinate system.


์–ด๋ ต๋‹ค, ์‰ฝ๊ฒŒ ๋งํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋‹น์‹ ์ด ํ„ฐ์น˜ํ•œ ์œ„์น˜ ์ •๋ณด(์ขŒํ‘œ)๋ฅผ ์•Œ๋ ค ์ค„๊ฒŒ! ์–ด๋Š view๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ• ์ง€ ์•Œ๋ ค์ค˜

์ฆ‰, ์ „์ฒด ํ™”๋ฉด์ƒ x,y๊ฐ€ ๋ช‡์ธ์ง€ ์•Œ๋ฉด ์ข‹๊ธด ํ•˜๊ฒ ์ง€๋งŒ,
ํŠน์ • view์œ„์—์„œ x,y๊ฐ€ ๋ช‡์ธ์ง€ ๊ณ„์‚ฐํ•˜๊ธฐ ๊ท€์ฐฎ์œผ๋‹ˆ ๊ธฐ์ค€์ ์„ ์•Œ๋ ค์ฃผ๋ฉด ์•Œ์•„์„œ ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์•Œ๋ ค์ค€๋‹ค.


๋‹ค์‹œ ๋งํ•ด,
์œ„์— ์ฃผ์„ 1์€ self.view ๊ธฐ์ค€์œผ๋กœ x,y๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฐ’์ด๊ณ 
์œ„์— ์ฃผ์„ 2๋Š” self.panGetstureView ๊ธฐ์ค€์œผ๋กœ x,y๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฐ’์ด๋‹ค.
(๋งˆ์น˜ view์˜ frame๊ณผ bound ์ฐจ์ด ๊ทธ๋Ÿฐ ๋Š๋‚Œโ€ฆ?)


๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ point์™€ .changed๋ฅผ ์ž˜ ์ƒ๊ฐํ•ด๋ณด์ž,
.began๊ณผ .ended๋Š” ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜์ง€๋งŒ .changed๋Š” ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ์ด ๋œ๋‹ค.


ํ•œ๋งˆ๋””๋กœ ๋กฑํ„ฐ์น˜ ์‹œ์ž‘ ํ›„ ๋ณ€ํ™”๋˜๋Š” ์œ„์น˜๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
์ด๋ฅผ ์ด์šฉํ•˜๋ฉด, ์œ„์— GIF์™€ ๊ฐ™์ด ๋กฑํ„ฐ์น˜ํ›„ ๋ณ€ํ™” ๋˜๋Š” ๊ฐ’์— ๋”ฐ๋ผ view๋ฅผ ์ด๋™์‹œ์ผœ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด ๋œ๋‹ค!


(์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๋œ๋‹ค๋ฉด ์œ„ ์ฝ”๋“œ์—์„œ point์™€ point2๋ฅผ ์ฃผ์„๊ฑธ๊ณ  printํ•ด์„œ x, y๊ฐ’์— ๋Œ€ํ•ด ๋ณด๋ฉด ์ดํ•ด์— ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™๋‹ค.)