ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

ios-og


๐Ÿ“ฑ Multi-Touch(๋ฉ€ํ‹ฐ ํ„ฐ์น˜)


  • ์ง์ ‘ ์šฐ๋ฆฌ๊ฐ€ ํ™”๋ฉด์— ํ„ฐ์น˜๋œ ์ž…๋ ฅ์„ ๋ชจ๋‘ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  iOS๊ฐ€ ๋ชจ๋“  ์›€์ง์ž„์„ ๊ด€์ฐฐํ•ด์„œ ์Šค์™€์ดํ”„, ํ™•๋Œ€/์ถ•์†Œ, ์ด๋™, ํƒญ ๋“ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • iOS๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ชจ๋“  ์ œ์Šค์ฒ˜๋Š” UIGestureRecognizer ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์†๊ฐ€๋ฝ์˜ ์›€์ง์ž„์„ ์ œ์Šค์ฒ˜๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ถ”์ƒ์ ์ธ ํด๋ž˜์Šค์ด๊ณ , ๋ชจ๋“  ์ œ์Šค์ฒ˜๋ฅผ ์ธ์‹ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŽ์€ ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์ œ์Šค์ฒ˜๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿข UIGestureRecognizer

  • ์ œ์Šค์ฒ˜๋ฅผ ์ธ์‹ํ•˜๋ฉด ํฌ๊ฒŒ ๋‘ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    1. ๋ทฐ์—๊ฒŒ ํ™•๋Œ€/์ถ•์†Œ๋‚˜ ํƒญ์„ ์ธ์‹ํ•˜๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค(e.g. plz start recognizing pinches/tabs).
    2. ์ธ์‹ํ–ˆ์„ ๋•Œ์— ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(providing a method to "handle" that gesture. not necessarily handled by the UIView).
  • ์œ„์˜ 1๋ฒˆ์€ ์ฃผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ์— ์˜ํ•ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค(ํ˜น์€ ์Šคํ† ๋ฆฌ๋ณด๋“œ).

    ๋•Œ๋•Œ๋กœ ๋ทฐ๊ฐ€ ์Šค์Šค๋กœ์—๊ฒŒ ์ œ์Šค์ฒ˜ ์ธ์‹ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ทฐ๋ฅผ ์Šคํฌ๋กคํ•˜๋Š” ๊ฒƒ์—๋Š” ํ™•๋Œ€/์ถ•์†Œ์™€ ์ด๋™ ์ œ์Šค์ฒ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์œ„์˜ ์ œ์Šค์ฒ˜๊ฐ€ ์—†์ด๋Š” ์Šคํฌ๋กค์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์œ„์˜ 2๋ฒˆ์€ ์ œ์Šค์ฒ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ชจ๋ธ์ด ์ œ์Šค์ฒ˜์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋ฐ›์•„์•ผ ํ•œ๋‹ค๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ทฐ๊ฐ€ ๋ณด์ด๋Š” ๋ฐฉ์‹์—๋งŒ ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฑฐ๋ผ๋ฉด ๋ทฐ๊ฐ€ ์ง์ ‘ ์ œ์Šค์ฒ˜๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ›  UIView์— gesture recognizer ์ถ”๊ฐ€ํ•˜๊ธฐ(Adding a gesture recognizer to a UIView)


  • ์œ„์˜ 1๋ฒˆ์ฒ˜๋Ÿผ ๋ทฐ์—๊ฒŒ ์ œ์Šค์ฒ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ณ  ์ธ์‹ํ•˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

    Outlet ์„ค์ •์ž์˜ didSet์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋Š” ์ด๋™ ์ œ์Šค์ฒ˜๋ฅผ ์ธ์‹ํ–ˆ์œผ๋ฉด ํ•˜๋Š” ๋ทฐ์— ์•„์šธ๋ ›์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

    iOS๊ฐ€ ์ด๋™ ์ œ์Šค์ฒ˜์˜ ์•„์šธ๋ ›์„ ๋ฌถ์–ด์„œ ๋ทฐ์— ์ „๋‹ฌํ•  ๋•Œ ์•„์šธ๋ ›์˜ didSet์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด UIGestureRecognizer๋ฅผ ์‚ฌ์šฉํ•ด ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ชจ๋“  recognizer๋Š” ๋™์ผํ•œ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ UIPanGestureRecognizer์˜ parameter๋Š” ๋‘๊ฐœ์ž…๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” ์ฒ˜๋ฆฌํ–ˆ์œผ๋ฉด ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” target์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ ์•„๋‹ˆ๋ฉด ๋ทฐ ์ž์‹ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” action์œผ๋กœ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์ด ์žˆ๊ณ  #selector์— ๋‘˜๋Ÿฌ์Œ“์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด action์€ ์ด๋™ ์ œ์Šค์ฒ˜๋ฅผ ์ธ์‹ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

    ์ด UIPanGestureRecognizer๋ฅผ ๋งŒ๋“  ๋’ค ์šฐ๋ฆฌ๋Š” ๋ทฐ์—๊ฒŒ ์ด๊ฒƒ์„ ์ธ์‹ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์— addGestureRecognizer๊ฐ€ ๋ฐ”๋กœ ์ด ์ž‘์—…์ž…๋‹ˆ๋‹ค.

    ๋ทฐ๋Š” ์ œ์Šค์ฒ˜ ์ธ์‹์ž๋ฅผ ์›ํ•˜๋Š” ๋งŒํผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ด์•ผ๊ธฐ๋Š” ํ•œ๋ฒˆ์— ํ•œ๊ฐ€์ง€ ์ธ์‹๋งŒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋™์‹œ์— 20๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ œ์Šค์ฒ˜๋ฅผ ์ธ์‹ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.


๐Ÿ‘ Handler ํ˜ธ์ถœํ•˜๊ธฐ


  • ์ด๋™ ์ œ์Šค์ฒ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ๋Š” ์œ„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด pan ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์ œ์Šค์ฒ˜๋Š” ๋‚˜๋ฆ„์˜ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ํ™•๋Œ€/์ถ•์†Œ ์ œ์Šค์ฒ˜๋Š” ๋น„์œจ์ด ๋˜๊ณ , ์ด๋™ ์ œ์Šค์ฒ˜๋Š” ์–ด๋””์—์„œ ์ œ์Šค์ฒ˜๊ฐ€ ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์ •๋ณด๋กœ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค๋ฉด UIPanGestureRecognizer๋Š” ์œ„์˜ ์„ธ๊ฐœ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. translation ๋ฉ”์†Œ๋“œ์˜ ๊ฒฝ์šฐ ์ด๋™ ์ œ์Šค์ฒ˜๊ฐ€ ๋ทฐ์˜ ์–ด๋””์—์„œ ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๋˜ velocity ๋ฉ”์†Œ๋“œ๋Š” ์ด๋™ ์ œ์Šค์ฒ˜์˜ ์†๋„๋ฅผ ๋งํ•ด์ฃผ๊ณ  setTranslation ๋ฉ”์†Œ๋“œ๋Š” ์ด๋™์„ ์ดˆ๊ธฐํ™”ํ•ด์„œ ์ด๋™์„ ์ ์ง„์ (incremental)์œผ๋กœ ์ผ์–ด๋‚˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์ง€์ ์—์„œ ์–ผ๋งˆ๋‚˜ ์›€์ง์˜€๋Š”์ง€๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ด๋™์ด ๋งˆ์ง€๋ง‰์œผ๋กœ ์ผ์–ด๋‚œ ์ง€์ ์—์„œ ์–ผ๋งˆ๋‚˜ ์›€์ง์˜€๋Š”์ง€๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ UIGestureRecognizer


  • UIGestureRecognizer๋Š” ์ถ”์ƒ์ ์ธ ์ˆ˜ํผํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— state๋ผ๋Š” ์•„์ฃผ ์ค‘์š”ํ•œ ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ œ์Šค์ฒ˜ ์ธ์‹์ž๋Š” ์ƒํƒœ ๊ธฐ๊ณ„(state machine)์ด๋ผ์„œ state๋ณ€์ˆ˜๊ฐ€ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋™ ๊ฐ™์€ ์ œ์Šค์ฒ˜๊ฐ€ ํ™•์ธ ๋  ๊ฒฝ์šฐ(e.g. ์†๊ฐ€๋ฝ ํ„ฐ์น˜๋˜์–ด ์•„๋ž˜๋กœ ์›€์ง์ผ ๋•Œ) state๊ฐ€ possible์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์›€์ง์ด๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ƒํƒœ๋Š” began์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค. ์ด๋™์ด ์‹œ์ž‘๋˜์—ˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์†๊ฐ€๋ฝ์„ ๊ณ„์† ์›€์ง์ด๋ฉด changed ์ƒํƒœ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค. ์ƒํƒœ ๋ณ€๊ฒฝ์ด ๋งค๋ฒˆ ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰ ๋  ๊ธฐํšŒ๋ฅผ ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋™ ์ œ์Šค์ฒ˜์—์„œ .changed๋Š” ์›€์ง์ผ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์†๊ฐ€๋ฝ์ด ๋–จ์–ด์ง€๋ฉด ์ œ์Šค์ฒ˜๊ฐ€ ๋๋‚˜๊ณ  .ended๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ํ•ธ๋“ค๋Ÿฌ๋Š” ์ƒํƒœ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ๊ณ„์† ํ˜ธ์ถœ๋˜๊ณ , ์Šค์™€์ดํ”„ ๊ฐ™์€ ๊ฒƒ์€ ์—ฐ์†์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šค์™€์ดํ”„๊ฐ€ ์ผ์–ด๋‚˜๋Š”๊ฐ€ ์•„๋‹Œ๊ฐ€๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ๋ถˆ์—ฐ์† ์ œ์Šค์ฒ˜๋ผ์„œ ์†๊ฐ€๋ฝ์ด ํ™”๋ฉด์„ ์•„๋ฌด๋ฆฌ ๋ˆ„๋น„๊ณ  ๋‹ค๋…€๋„ .changed๋Š” ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. .ended๋ฅผ ์–ป๊ฑฐ๋‚˜ .recognized๊ฐ€ ํ•ธ๋“ค๋Ÿฌ์—๊ฒŒ ํ•œ ๋ฒˆ ์ „๋‹ฌ๋  ๋ฟ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฐ์†์ ์ธ ์ œ์Šค์ฒ˜์—๋Š” .changed๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ .failed๋‚˜ .cancelled๋ผ๋Š” ์ƒํƒœ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    • .failed๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ œ์Šค์ฒ˜ ์ค‘์— ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ์šฐ์œ„๋ฅผ ์ ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(one of them wins). ์˜ˆ๋ฅผ ๋“ค์–ด, ํƒญ๊ณผ ์ด๋™์„ ๋™์‹œ์— ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค๋ฅผ ์•„๋ž˜๋กœ ์›€์ง์ด๋ฉด ๋‘˜์ด ๋™์‹œ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ„ฐ์น˜ํ•œ ์งํ›„์— ๋ฐ”๋กœ ์–ป์–ด์ง€๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณง๋ฐ”๋กœ ์†๊ฐ€๋ฝ์„ ๋‹ค์‹œ ๋• ์„ ๋•Œ๋Š” ์ด๋™์ด ๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฑ„๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๊ฐ€ ์ทจ์†Œ๋˜๋Š” ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด failed๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ์Šค์ฒ˜๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ์‹œ์ž‘ํ•œ ํ›„์— ์ƒํƒœ๊ฐ€ ๋ฐ”๋€๋‹ˆ๋‹ค. ํ„ฐ์น˜ํ•œ์ง€ ์–ผ๋งˆ ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ ์ œ์Šค์ฒ˜๊ฐ€ ์ธ์‹๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
    • .cancelled๋Š” ์ฃผ๋กœ drag&drop ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ์‹œ์ž‘ํ•ด์„œ ์ž˜ ๊ฐ€๋‹ค๊ฐ€ ๋“œ๋ž˜๊ทธ & ๋“œ๋กญ์„ ํ•˜๋ฉด ๋ฌด์Šจ ์ œ์Šค์ฒ˜๊ฐ€ ์ธ์‹๋˜์—ˆ๋“ ์ง€ ์ทจ์†Œ๋˜์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

    ๊ทธ๋ž˜์„œ failed๋‚˜ cancelled๋ฅผ ์˜ˆ์˜์ฃผ์‹œํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ™”๋ฉด์—์„œ ์—†์• ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊น”๋”ํ•˜๊ฒŒ ์น˜์›Œ๋ฒ„๋ฆด(clean up) ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ œ์Šค์ฒ˜๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ failed๋‚˜ cancelled ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


๐Ÿณ Pan Handler ์˜ˆ์‹œ


  • pan ๋ฉ”์†Œ๋“œ์˜ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    pan ๋ฉ”์†Œ๋“œ๋Š” ์•„๊นŒ ์ž‘์„ฑํ–ˆ๋˜ UIPanGestureRecognizer๋ฅผ parameter๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  state์— ๋Œ€ํ•ด์„œ switch๋ฌธ์„ ๋™์ž‘์‹œํ‚ต๋‹ˆ๋‹ค. .changed๋‚˜ .ended์˜ ๊ฒฝ์šฐ์—๋Š” ์ด๋™ ์ œ์Šค์ฒ˜๊ฐ€ ๊ณ„์† ์›€์ง์ด๊ณ  ์žˆ๊ฑฐ๋‚˜ ๋ฐฉ๊ธˆ ๋๋‚ฌ์„ ๊ฒ๋‹ˆ๋‹ค. ์œ„์น˜์— ๋”ฐ๋ผ pan์„ ๊ฑด๋“œ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” pan์„ ์›ํ•œ๋‹ค๋ฉด 0์œผ๋กœ ๋ฆฌ์…‹ํ•ด์•ผ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ œ์Šค์ฒ˜๊ฐ€ 0์—์„œ ์‹œ์ž‘ํ•ด์„œ ์ ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๐Ÿฆ€ UIPinchGestureRecognizer


  • scale: PinchGesture๋Š” ๋น„์œจ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ™•๋Œ€/ ์ถ•์†Œ๋ฅผ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ๋‘ ๋ฐฐ ๋„“๊ฒŒ ์†๊ฐ€๋ฝ์„ ํ”ผ๋ฉด scale์€ 2.0์ด ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜์œผ๋กœ ์ค„์ด๋ฉด ๋ฐ˜๋Œ€๋กœ 0.5๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • velocity: ์†๋„ ์ •๋ณด ์ž…๋‹ˆ๋‹ค.

  • rotation: RotationGesture๋Š” ์†์žก์ด๋ฅผ ๋Œ๋ฆฌ๋“ฏ์ด ์†๊ฐ€๋ฝ ๋‘ ๊ฐœ๋กœ ์†์žก์ด๋ฅผ ๋Œ๋ฆฌ๋Š” ์ œ์Šค์ฒ˜์ž…๋‹ˆ๋‹ค. Radian ๋‹จ์œ„๋กœ ์†์žก์ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋Œ์•„๊ฐ”๋Š”์ง€๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

Swipe๋Š” ๋‹ค๋ฅธ ์ œ์Šค์ฒ˜์™€ ๋‹ฌ๋ผ์„œ ๋”ฐ๋กœ ์ •ํ•ด์ค˜์•ผํ•˜๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค(e.g. ๋ช‡ ๊ฐœ์˜ ์†๊ฐ€๋ฝ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€, ์–ด๋–ค ๋ฐฉํ–ฅ์ธ์ง€). ์ดํ›„ SwipeGesture๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ์ž‘๋™์‹œํ‚จ ๋’ค์— ์Šค์™€์ดํ”„๊ฐ€ ์ผ์–ด๋‚˜๋ฉด .ended๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ํ•ธ๋“ค๋Ÿฌ๋Š” .ended์™€ ํ•จ๊ป˜ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ๋”ฐ๋กœ ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ๊ณผ ์ธ์‹์„ ํ–ˆ๋Š”์ง€ ์•ˆํ–ˆ๋Š”์ง€๋งŒ์„ ๋งํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


Tap Gesture๋Š” ์Šค์™€์ดํ”„ ๊ฐ™์€ ๋Š๋‚Œ์ด๋ฉฐ ๋ถˆ์—ฐ์† ์ œ์Šค์ฒ˜ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Double Tap ๊ฐ™์€ ๊ฒƒ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— TapGesture๋กœ .ended๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Swipe์ฒ˜๋Ÿผ ํƒญ์ด ๋ช‡ ๊ฐœ์ด๊ณ  ์†๊ฐ€๋ฝ์€ ๋ช‡ ๊ฐœ์ธ์ง€ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


LongPress๋Š” ์—ฐ์† ์ œ์Šค์ฒ˜์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊พน ๋ˆ„๋ฅด๊ณ  ์žˆ๋Š” ์™€์ค‘์— ์†๊ฐ€๋ฝ์ด ์•ฝ๊ฐ„ ์›€์ง์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์กฐ๊ธˆ๋งŒ ์›€์ง์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ด๋™์ œ์Šค์ฒ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์›€์ง์ด๊ธด ํ–ˆ์œผ๋‹ˆ .changed๋ฅผ ์–ป๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ ์–ผ๋งˆ์˜ ์›€์ง์ž„์„ ํ—ˆ์šฉํ•  ๊ฒƒ์ธ์ง€, LongPress๊ฐ€ ๋ถˆ๋ฆฌ๊ธฐ ์ „์— ์–ผ๋งˆ๋‚˜ ๋ˆ„๋ฅด๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋“œ๋ž˜๊ทธ & ๋“œ๋กญ์ด ๊ฐ„์„ญ์„ ๋งŽ์ด ํ•˜๊ณค ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋“œ๋ž˜๊ทธ & ๋“œ๋กญ๋„ LongPress๋ฅผ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋“œ๋ž˜๊ทธ & ๋“œ๋กญ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ง‘์„ ๋•Œ LongPress๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.


Reference: Stanford CS193p by Paul Hegarty

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๋ฐ˜์‘ํ˜•
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG more
ยซ   2024/11   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
๊ธ€ ๋ณด๊ด€ํ•จ