์ ๊ธ์์ ๊ฐ๋จํ๊ฒ ์๊ฐํ์ง๋ง Responder Chain์ ๊ฐ๋จํ๊ฒ ์๊ณ ๋์ด๊ฐ ๋งํ ๊ฒ์ด ์๋๋ค. ์ด๋ค ์์ผ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ผ ํ๋ ์ค์๋ฅผ ๊ฐ์งํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์ด๋ฒคํธ๋ฅผ ๋๊ธฐ๋์ง์ ๊ดํ ๋ด์ฉ์ ์ดํดํด์ผ ์ฌ์ฉ์์์ ์ ๋๋ก๋ interaction์ด ์๋ ์ฑ์ ๋ง๋ค ์ ์์ ๊ฒ์ด๋ค. ์ด๋ฒ์๋ Hit Test์ Responder chain์ ๋ํด์ ์ ๋๋ก ์์๋ณด๋๋ก ํ์. ๊ทธ๋ผ ์์ํ์.
Responder Chain
๊ฐ์ฅ ์์ (View ๊ณ์ธต ๊ตฌ์กฐ์์ ์ด๋ฒคํธ ๋ฐ์์, ๊ฐ์ฅ ์์ ์๋ UI ์์) ์์๋ก ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋๊ณ , ๋ง์ฝ ํด๋น ์ด๋ฒคํธ๋ฅผ ๋ฐ์ง ๋ชปํ๋ค๋ฉด, ๊ทธ๋ณด๋ค ์์์ ์๋
UIResponder
๊ฐ์ฒด๋ก ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋๋ ๋ฐฉ์
์ฌ์ฉ์๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ๋ค. ๊ทธ ์ด๋ฒคํธ์ ์ข ๋ฅ๋ ๋ค์ํ๊ฒ ์ผ๋ ์ผ๋จ ํฐ์น๋ฅผ ์๊ฐํด๋ณด์. View๋ ๊ณ์ธต์ ์ด๋ฃจ๋ฉด์ ๊ตฌํ๋๊ฒ ๋๋๋ฐ, ํน์ ์์๊ฐ ํฐ์น๋์๋ค๋ ๊ฒ์ ์ด๋ป๊ฒ ์ ์ ์์๊น? ๊ทธ๋ฆฌ๊ณ ํน์ ์์๊ฐ ํฐ์น๋์ง ์๊ธธ ๋ฐ๋๋ค๋ฉด, ์ฌ์ฉ์์ ํฐ์น ์์ฒด๋ ๋ฐ๋ก ๋ฌด์๋๋ ๊ฒ์ผ๊น?
์ด๋ฌํ ์๋ฌธ์ ๋ํ ๋ต์ด Responder Chain์ด๋ค. ๋จผ์ Hit test๋ฅผ ํตํด view ๊ณ์ธต์์ ๊ฐ์ฅ ์์์ ์๋ view๋ฅผ ์์๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด View๋ก Event๊ฐ ์ ๋ฌ๋๊ณ , ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง์ด ์๋ ๊ฒฝ์ฐ, ํด๋น View์ ์์(superView) view๋ก ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋๋ค. ์ต์ข
์ ์ผ๋ก UIApplication์์ ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋๊ณ , ๋ฐ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ์๋ฉธ๋๋ค. ์ฌ๊ธฐ์ View๋ผ ํต์นญํ์ผ๋, ์ค์ง์ ์ผ๋ก UIResponder
๊ฐ์ฒด๋ฅผ ์์๋ฐ์ ๊ฐ์ฒด(์: UIView
, UIViewController
, UIApplication
)๋ฅผ ๋งํ๋ค.
์์๋์ด์ผ ํ ์ฉ์ด
UIResponder
์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด๋ UIResponder๋ฅผ ์์ ๋ฐ์์ผ ํ๋ค. ๋๋ถ๋ถ์ ์ฐ๋ฆฌ๊ฐ ์๋ View ์์๋ค์ด ํด๋น ํด๋์ค๋ฅผ ์์ํด์ ๋ง๋ค์ด์ ธ ์๋ค.
UIEvent
Event๋ ๋๋ฐ์ด์ค์ ์ฌ์ฉ์๊ฐ ์๋ก ์ํตํ๊ธฐ ์ํ ์ผ์ข ์ ์ธํฐํ์ด์ค๋ผ ์๊ฐํ ์ ์์ ๊ฒ์ด๋ค. ํฐ์น, ๋ฆฌ๋ชจ์ปจ ๋ฒํผ ๋๋ฆ, ๋ชจ์ ๋ฑ๋ฑ ๋ค์ํ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์ ์๊ณ ๋๋ฐ์ด์ค๋ ์ด๋ฅผ ์์ ํ๋ค. ํฐ์น๋ฅผ ์ฐ๋ฆฌ๋ ์๋ง ๊ฐ์ฅ ๋ง์ด ๋ค๋ฃจ๊ฒ ๋ ๊ฒ์ด๋ค.
์ด ๋ถ๋ถ์์ ์์๋์ด์ผ ํ๋ ๊ฒ์, ์ด๋ฒคํธ ๊ฐ์ฒด๊ฐ ๊ฐ์ ์ด๋ฒคํธ์ ๋ํด์ ์ฌ์ฌ์ฉ๋๋ค๋ ๊ฒ์ด๋ค. ์ฆ, ์ดํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๊ณ , ํน์ ์ด๋ฒคํธ(ํฐ์น)๊ฐ ์ฒ์์ผ๋ก ๋ฐ์๋๋ฉด, ์ด ์ด๋ฒคํธ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ๋ค์ ์ด๋ฒคํธ์์๋ ์ฌ์ฌ์ฉ๋๋ค. ์์ฑ๋ ์ด๋ฒคํธ๊ฐ ํฐ์น๋ผ๋ฉด, UITouch ๊ฐ์ฒด๋ฅผ ํฌํจํ๋ค.
UITouch
ํฐ์น ์ด๋ฒคํธ ๋ฐ์์, ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋์์ ๋ฐ์ํ ํฐ์น์ ๊ดํ ์ ๋ณด๋ฅผ ๋ด๋ UITouch ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค. ๋ด๋ถ์ ๋ค์ด์๋ ์ ๋ณด๋ ์๋์ ๊ฐ๋ค.
- ํฐ์น๊ฐ ๋ฐ์ํ view, or window property
- ํฐ์น๊ฐ ๋ฐ์ํ view/window์์์ ์ขํ (
func location(in: UIView?)
method) - ํฐ์น์ ๋ฐ์ง๋ฆ
- ํฐ์น์ ๊ฐ๋
- ํฐ์น ํ์
- ๊ฐ์ ์ขํ์ ๋ํ ํฐ์น ๋ฐ์์ ์ฆ๊ฐํจ
- ์ฒ์น๋ ์๊ฐ์ ์๊ฐ
UIControl
addTarget(_:action:for:)
method๋ก ์ด๋ฒคํธ์ ์ก์
์ ์ฐ๊ฒฐํ๋ค. UIControl์ UIResponder ๋ฉ์๋๋ณด๋ค ์์(๊ณ ์์ค) ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค. ์ฆ, ์ด๋ฒคํธ์ ๋ํ ๋ถ์์ด ๋ชจ๋ ๋๋ ์ํ๋ก ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด, UIButton์ .touchUpInside
์ ๊ฒฝ์ฐ ๋ฒํผ boundary๋ด์์ ํฐ์น๊ฐ ์์๋๊ณ ๋๋ฌ์ ๋๋ฅผ ์๋ฏธํ๋ UIControl.Event
๊ฐ์ฒด์ด๋ค. ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ UIResponder๊ฐ ์ ๊ณตํ๋ method (touchesBegan
, touchesEnded
override)๋ก ๊ตฌํํ๋ค๋ฉด ๋ช๋จ๊ณ๋ ์ถ๊ฐ๋์ด์ผ ํ ๊น? ํฐ์น ์์, ๋์ ํด๋นํ๋ ๋ฉ์๋๋ฅผ overrideํด์ผ ํ ๊ฒ์ด๊ณ , target-action์ผ๋ก ์ฐ๊ฒฐ๋ ํด์ฃผ์ด์ผ ํ ๊ฒ์ด๋ค. ์๋นํ ๊ท์ฐฎ๋ค.