-
[iOS] ๋ฆฌ์คํฐ๋ ์ฒด์ธ (Responder Chain) ์ด๋? (feat. UIResponder, First Responder, UIEvent)iOS/๐ค App 2021. 7. 12. 13:25
์๋ ํ์ธ์๐ถ
์ด๋ฒ ์๊ฐ์๋ ๋ฆฌ์คํฐ๋ ์ฒด์ธ (Responder Chain) ์ ๋ํด์ ๊ณต๋ถํด๋ณด๊ฒ ์ต๋๋ค.
๋ฆฌ์คํฐ๋ ์ฒด์ธ์ ๊ณต๋ถํ๋ฉด
์ฑ ๋ด์์ ์ด๋ฒคํธ๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๋ฌ๋๋์ง ์ ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด ๊ธ์์ ๋ค๋ฃจ๋ ๊ฒ:
UIResponder, Responder Chain, First Responder, UIEvent
๊ทธ๋ผ ์์ํด๋ณผ๊ฒ์๐ฅ
๋ฆฌ์คํฐ๋ ์ฒด์ธ์ ๋ฆฌ์คํฐ๋ ์ค๋ธ์ ํธ๋ค์ด ๋์ ์ผ๋ก ๊ตฌ์ฑ๋ ์ด๋ฒคํธ ์ ๋ฌ ์ฒด์ธ ์ ๋๋ค.
์ฑ์ ๋ฆฌ์คํฐ๋ ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ฆฌ์คํฐ๋ ์ค๋ธ์ ํธ๋ UIReponder ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
๋ํ์ ์ผ๋ก UIView (๊ทธ๋ฆฌ๊ณ UIView์ ์๋ธํด๋์ค์ธ UIWindow) , UIViewController, UIApplication ๊ฐ ์์ต๋๋ค.
๋ฆฌ์คํฐ๋๋ Event Raw Data ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
๋ง์ฝ ๋ฆฌ์คํฐ๋๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์๋ค๋ฉด ๋ฆฌ์คํฐ๋๋ ๋ฐ๋์ ๊ทธ๊ฒ์ ์ฒ๋ฆฌํ๊ฑฐ๋, ๋ค๋ฅธ ๋ฆฌ์คํฐ๋ ์ค๋ธ์ ํธ๋ก ๋๊ฒจ์ฃผ์ด์ผ ํฉ๋๋ค.
์ฑ์ด ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ๋ฐ์์ ๋,
UIKit ์ ์๋์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ ๊ฐ์ฅ ์ ์ ํ ๋ฆฌ์คํฐ๋ ์ค๋ธ์ ํธ๋ก ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํฉ๋๋ค.
์ฌ๊ธฐ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ ๊ฐ์ฅ ์ ์ ํ ๋ฆฌ์คํฐ๋ ์ค๋ธ์ ํธ๋ฅผ First Responder ๋ผ๊ณ ํฉ๋๋ค.
์ฒ๋ฆฌ๋์ง ์์ ์ด๋ฒคํธ๋ค์ ๋ฆฌ์คํฐ๋์์ ๋ค๋ฅธ ๋ฆฌ์คํฐ๋๋ก
์ค์๊ฐ ๋ฆฌ์คํฐ๋ ์ฒด์ธ (Active responder chain) ์ ๋ฐ๋ผ ์ด๋ํฉ๋๋ค.
์ด ๋ฆฌ์คํฐ๋ ์ฒด์ธ์ ์ฑ์ ๋ฆฌ์คํฐ๋ ์ค๋ธ์ ํธ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
์๋ ๊ทธ๋ฆผ์ Label, Textfield, Button ๊ทธ๋ฆฌ๊ณ ๋ ๊ฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋ View ๋ก UI ๋ฅผ ๊ตฌ์ฑํ ์ฑ์ ๋ฆฌ์คํฐ๋๋ค์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.
๊ทธ๋ฆผ์ ํ์ดํ๋ฅผ ํตํด ์ค๋ธ์ ํธ๋ค์ ๋ฆฌ์คํฐ๋ ์ฒด์ธ์ผ๋ก ๊ตฌ์ฑ๋๋ ๊ฒ์ ๋๋ค.
ํ์ดํ ๋ฐฉํฅ์ผ๋ก ์ฒ๋ฆฌ๋์ง ์์ ์ด๋ฒคํธ๋ค์ด ์ ๋ฌ ๋ฉ๋๋ค.
๋ง์ฝ Textfield ๊ฐ ์ ๋ฌ๋ฐ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ์ง ์๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
UIKit ์ TextField ์ ์ํผ๋ทฐ์ธ UIView ๋ก ์ฐ์ ์ ๋ฌํฉ๋๋ค.
๋ง์ฝ ์ด UIView ๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ์ง ์๋๋ค๋ฉด, UIWindow ์ ๋ฃจํธ ๋ทฐ์ธ (๋ ๋ฒ์งธ ์ฒญ๋ก์) UIView ๋ก ์ ๋ฌ ๋ ๊ฒ์ ๋๋ค.
๋ฃจํธ ๋ทฐ์์, ๋ฆฌ์คํฐ๋ ์ฒด์ธ์ ๋ฃจํธ ๋ทฐ๋ฅผ ์์ ํ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํฉ๋๋ค.
์๋์ฐ๋ก ์ ๋ฌํ๋ ๊ฒ์ ๊ทธ ์ดํ ์ ๋๋ค.
>> ์๋์ฐ์ ๋ํด ๊ถ๊ธํ๋ค๋ฉด?? <<
๋ง์ฝ ์๋์ฐ๊ฐ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค๋ฉด, UIKit ์ ์ด๋ฒคํธ๋ฅผ UIApplication ์ค๋ธ์ ํธ๋ก ์ ๋ฌํฉ๋๋ค.
์ดํ ์ฑ ๋ธ๋ฆฌ๊ฒ์ดํธ์ ์ ๋ฌ๋ ๊ฐ๋ฅ์ฑ๋ ์์ต๋๋ค.
Determining an Event's First Responder
" ์ด๋ฒคํธ์ First Responder ๊ฒฐ์ ํ๊ธฐ "
์์์ UIKit ์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ฅ ์ ์ ํ ๋ฆฌ์คํฐ๋ ์ค๋ธ์ ํธ์ ์ ๋ฌํ๋ค๊ณ ์ธ๊ธํ๋๋ฐ์.
๊ทธ๋ฆฌ๊ณ ์ด ์ค๋ธ์ ํธ๋ฅผ 'First Responder' ๋ผ๊ณ ๋ถ๋ฅธ๋ค๊ณ ๋ ๋งํ์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด UIKit ์ ์ด๋ค ๊ธฐ์ค์ผ๋ก ์ด First Responder ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ์ผ๊น์???
๋ฐ๋ก ๋ฐ์ํ ์ด๋ฒคํธ์ ํ์ ์ ๋๋น
์ฌ๊ธฐ์ ๋งํ๋ ์ด๋ฒคํธ๋ UIEvent ์ ์ธ์คํด์ค์ธ๋ฐ, type ์ ๋ฐ๋ผ ์ฌ๋ฌ ์ข ๋ฅ์ ์ด๋ฒคํธ๊ฐ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๊ฐ์ฅ ์์ฃผ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ ๋ฐ๋ก๋ฐ๋ก ํฐ์น ์ด๋ฒคํธ์ด๊ฒ ์ฃ ?
์ฐธ๊ณ ๋ก
Press ๋ ๋ฌผ๋ฆฌ ํค์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ
Remote-control ์ ํค๋ํฐ ๋ฑ์ ์ธ๋ถ ๊ธฐ๊ธฐ์์ ๋๋ฅด๋ ๋ฒํผ์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ,
Editing menu ์ ๊ฒฝ์ฐ ์ฐ๋ฆฌ๊ฐ ์์ดํฐ์์ Text ๋ฅผ ์งง๊ฒ ํน์ ๊ธธ๊ฒ ๋๋ฅผ ๋ ๋จ๋ ๊ทธ ๋ฉ๋ด์ ๋๋ค.
Shake-motion ์ด๋ฒคํธ๋ ํ๋ค ๋ ๋ฐ์ํ๋๋ฐ,
์ด๊ฒ์ ๋ฆฌ์คํฐ๋ ์ฒด์ธ์์ ์ฒ๋ฆฌํ์ง ์๊ณ Core Motion ์ค๋ธ์ ํธ๋ก ์ ๋ฌ๋ฉ๋๋ค.
์ปจํธ๋กค์ UIControl ์ ์๋ธํด๋์ฑํ ํด๋์ค์ ์ค๋ธ์ ํธ๋ค์ ๊ฐ๋ฆฌํต๋๋ค.
์ปจํธ๋กค์ target-action mechanism ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ์ฃ .
๊ทธ๋์ ์ปจํธ๋กค์ ์ก์ ๋ฉ์์ง๋ฅผ ์ด์ฉํด ๋ฐ๋ก ์์ ์ ํ์ผ ์ค๋ธ์ ํธ์ ์ํตํฉ๋๋ค.
์ก์ ๋ฉ์์ง๋ ์ด๋ฒคํธ๊ฐ ์๋๋๋ค.
ํ์ง๋ง ์ฌ์ ํ ๋ฆฌ์คํฐ๋ ์ฒด์ธ์ ์ด์ฉํฉ๋๋ค.
์ปจํธ๋กค์ ํ๊ฒ ์ค๋ธ์ ํธ๊ฐ ์ค์ ๋์ด ์์ง ์์ ๊ฒฝ์ฐ,
UIKit์ ํ๊ฒ ์ค๋ธ์ ํธ๋ถํฐ ์์ํ์ฌ
์ก์ ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ค๋ธ์ ํธ๋ฅผ ์ฐพ์ ๋๊น์ง ๋ฆฌ์คํฐ๋ ์ฒด์ธ์ ๋์๋ค๋๋๋ค.
์๋ฅผ ๋ค์ด UIkit ์ editing menu ๋ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ๋๋ฐ,
cut(_ :), copy(_ : ), paste(_ :) ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ค๋ธ์ ํธ๋ฅผ ์ฐพ์ผ๋ฌ ๋ฆฌ์คํฐ๋ ์ฒด์ธ์ ๋์๋ค๋๋ ๊ฒ๋๋ค.
๋ทฐ ์์ Gestsure recognizer ๊ฐ ์๋ค๋ฉด, Gesture recognizer ๊ฐ ๋จผ์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ๋ฐ๊ณ ์ฒ๋ฆฌ๋ฅผ ์๋ํฉ๋๋ค.
๋ง์ฝ ์คํจํ๋ค๋ฉด, ๋ฆฌ์คํฐ๋ ์ฒด์ธ์ ๋ฐ๋ผ ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
Determining Which Responder Contained a Touch Event
" ์ด๋ค ๋ฆฌ์คํฐ๋๊ฐ ์ด๋ฒคํธ๋ฅผ ํฌํจํ๊ณ ์๋์ง ๊ฒฐ์ ํ๊ธฐ "
UIkit ์ ๋ทฐ ๊ธฐ๋ฐ hit-testing ์ ์ฌ์ฉํ์ฌ ํฐ์น ์ด๋ฒคํธ๊ฐ ์ด๋์ ๋ฐ์ํ์๋์ง ๊ฒฐ์ ํฉ๋๋ค.
๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋งํ์๋ฉด, UIKit ์ ํฐ์น ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์น์ ๋ทฐ ๊ณ์ธต์ ๋ทฐ ์ค๋ธ์ ํธ์ bounds ์ ๋น๊ต๋ฅผ ํฉ๋๋ค.
UIView ์ hitTest(_:with:) ๋ฉ์๋๋ ๋ทฐ ๊ณ์ธต์ ๋์๋ค๋๋ฉฐ
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ํฐ์น ์ง์ ์ ํฌํจํ๊ณ ์๋ ๋ทฐ์ ๊ณ์ธต ์ ๊ฐ์ฅ ์ตํ๋จ ์๋ธ๋ทฐ๋ฅผ ์ฐพ๊ณ ,
๊ทธ๊ฒ์ ํฐ์น ์ด๋ฒคํธ์ First Responder ๋ก ์ง์ ํฉ๋๋ค.
๋ง์ฝ ํฐ์น ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์น๊ฐ ๋ทฐ์ bounds ์ ๋ฐ์ ์๋ค๋ฉด,
hitTest(_:with:) ๋ ํด๋น ๋ทฐ์ ์๋ธ๋ทฐ๋ฅผ ๋ชจ๋ ๋ฌด์ํฉ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ทฐ์ ์์ฑ clipsToBounds ๊ฐ false ๋ก ์ค์ ๋์ด ์์ ๋,
๋ทฐ์ bounds ๋ฅผ ๋ฒ์ด๋ ์๋ธ๋ทฐ์์ ํฐ์น๊ฐ ๋ฐ์ํ์๋๋ผ๋ hitTest(_:with:) ๋ ๋ทฐ๋ฅผ ๋ฆฌํดํ์ง ์์ต๋๋ค.
์ด hit-testing ๋์์ ๋ํด์ ์ข ๋ ์์ธํ ์ดํด๋ณด์๋ฉด, hitTest(_:with:) ๋ฉ์๋๋ฅผ ์ดํด๋ณด์์ผํ๋๋ฐ์.
hitTest(_:with:)
์ฐ์ ์ด ๋ฉ์๋๋ UIView ์ ์ธ์คํด์ค ๋ฉ์๋์ด๊ตฌ์...
๋ฐ์ํ ์ด๋ฒคํธ๊ฐ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
์ด ๋ ์ด๋ฒคํธ๋ UIEvent ์ค๋ธ์ ํธ๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ ๋๋ค.
์ด ๋ฉ์๋๋ ์ ๋ฌ๋ฐ์ ํฌ์ธํธ์ ์์นํ ๋ทฐ ์ค ์์ ์ ํฌํจํ์ฌ ๋ทฐ ๊ณ์ธต ์ตํ๋จ์ ์๋ธ๋ทฐ๋ฅผ ๋ฐํํฉ๋๋ค.
๋ง์ฝ ํธ์ถ๋ ๋ทฐ ๊ณ์ธต์ ๋ฐ๊นฅ์์ ๋ฐ์ํ ์ด๋ฒคํธ์ผ ๊ฒฝ์ฐ nil ์ ๋ฐํํฉ๋๋ค.
์ค์ํ ์ ์ ํธ์ถ๋ ๋ทฐ์ bounds ์ ๋ฐ๊นฅ์์ ๋ฐ์ํ ์ด๋ฒคํธ๋ผ๋ฉด nil ์ ๋ฐํํ๋ค๋ ๊ฒ์ ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก hidden์ด๊ฑฐ๋ alpha ๊ฐ์ด 0.01 ์ดํ๊ฑฐ๋
user interation์ disabled ํด๋์ ๋ทฐ๋ผ๋ฉด ๋ฌด์๋ฉ๋๋ค.
์ด ๋ฉ์๋๋ hit์ ๊ฒฐ์ ํ ๋ ๋ทฐ์ ์ปจํ ์ธ ๋ฅผ ๊ณ ๋ คํ์ง ์์ต๋๋ค.
์ฆ, ์ฝํ ์ธ ์ ํฌ๋ช ํ ๋ถ๋ถ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์์ด๋ ๋ทฐ๋ ๋ฐํ๋ฉ๋๋ค.
ํฐ์น๊ฐ ๋ฐ์ํ๋ค๋ฉด UIKit ์ UITouch ์ค๋ธ์ ํธ๋ฅผ ํฐ์น๊ฐ ๋ฐ์ํ ๋ทฐ์ ๊ด๋ จ์์ผ์ ์์ฑ์ ํฉ๋๋ค.
ํฐ์น์ ์์น๋, ๋ค๋ฅธ ํ๋ผ๋ฏธํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด UIKit ์ ๋์ผํ UITouch ์ค๋ธ์ ํธ๋ฅผ ์๋ก์ด ์ ๋ณด๋ก ์ ๋ฐ์ดํธ ํฉ๋๋ค.
์ด UITouch ์ค๋ธ์ ํธ์์ ํญ์ ๋ณํ์ง ์๋ ๊ฒ์ด ์๋๋ฐ, ๋ฐ๋ก view ์์ฑ ์ ๋๋ค.
์ด ์์ฑ์ ๋ง์ฝ ํฐ์น์ ์์น๊ฐ ๋ค๋ฅธ ๋ทฐ๋ก ๋ฐ๋์์ด๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
( ์ฆ, ์๊ฐ๋ฝ์ด A ๋ทฐ์์ B ๋ทฐ ์๋ก ์ด๋ํ์์ด๋ view ์์ฑ์ ๋ฐ๋์ง ์์ต๋๋ค.)
Altering the Responder Chain
"๋ฆฌ์คํฐ๋ ์ฒด์ธ์ ๋ณ๊ฒฝํ๊ธฐ"
์ฐ๋ฆฌ๋ ๋ฆฌ์คํฐ๋ ์ค๋ธ์ ํธ์ next ๋ผ๋ ์์ฑ์ ์ค๋ฒ๋ผ์ด๋ฉํด์ ๋ฆฌ์คํฐ๋ ์ฒด์ธ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋ณ๊ฒฝ์ ํ๋ค๋ฉด, ๋ฆฌ์คํฐ๋ ์ค๋ธ์ ํธ๊ฐ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ ๋ค์ ๋ฆฌ์คํฐ๋๋ ์ฐ๋ฆฌ๊ฐ ์ค๋ฒ๋ผ์ด๋ฉํ ์ค๋ธ์ ํธ๊ฐ ๋ฉ๋๋ค.
๋ง์ UIKit ํด๋์ค๊ฐ ์ด๋ฏธ ์ด next ์์ฑ์ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ฌ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๐ข ์๋ฅผ ๋ค๋ฉด:
UIView ์ค๋ธ์ ํธ๋ ๋ง์ฝ ์์ ์ด ๋ทฐ ์ปจํธ๋กค๋ฌ์ ๋ฃจํธ ๋ทฐ๋ผ๋ฉด, ๋ค์ ๋ฆฌ์คํฐ๋ ์ค๋ธ์ ํธ๋ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฉ๋๋ค.
๋ฃจํธ๋ทฐ๊ฐ ์๋๋ผ๋ฉด, ๋ทฐ์ ์ํผ๋ทฐ๊ฐ ๋ค์ ๋ฆฌ์คํฐ๋๊ฐ ๋ฉ๋๋ค.
UIViewController ์ค๋ธ์ ํธ๋ ๋ง์ฝ ์์ ์ด ๊ด๋ฆฌํ๋ ๋ทฐ๊ฐ ์๋์ฐ์ ๋ฃจํธ ๋ทฐ๋ผ๋ฉด, ๋ค์ ๋ฆฌ์คํฐ๋๋ ์๋์ฐ ์ค๋ธ์ ํธ๊ฐ ๋ฉ๋๋ค.
๋ํ ๋ง์ฝ A ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ B ๋ทฐ ์ปจํธ๋กค๋ฌ์ ์ํด present ๋๊ณ ์๋ค๋ฉด
์ฐ๋ฆฌ๋ A ๋ฅผ Presented ViewController, B ๋ฅผ Presenting ViewController ๋ผ๊ณ ๋ถ๋ฅด์ฃ .
์ด ๋ Presented ViewController์ ๋ค์ ๋ฆฌ์คํฐ๋๋ presenting ViewController ์ ๋๋ค.
UIWindow ์ค๋ธ์ ํธ (์ฆ ์๋์ฐ) ์ ๋ค์ ๋ฆฌ์คํฐ๋๋ UIApplication ์ค๋ธ์ ํธ ์ ๋๋ค.
๋!
๐ค๐ข[์ฐ์งฑ์ iOS ๋ธ๋ก๊ทธ]๐ต๐ป
iOS๋ฅผ ๊ณต๋ถํ๋ฉด์ ๋ฐฐ์ด ๋ด์ฉ์ ๊ธฐ๋กํ๊ณ ์์ต๋๋ค.์ฐธ๊ณ ์๋ฃ 1: https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/using_responders_and_the_responder_chain_to_handle_events
์ฐธ๊ณ ์๋ฃ 2: https://developer.apple.com/documentation/uikit/uiresponder
'iOS > ๐ค App' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] Safe Area ์ Layout Margins ์ด๋? (3) 2021.08.10 [iOS] Container View Controller ๋? (0) 2021.07.26 [iOS] ์๋์ฐ๋? (feat. UIWindow) (0) 2021.07.05 [iOS] Core Animation ์ด๋? (2) (0) 2021.07.05 [iOS] Core Animation ์ด๋? (1) (0) 2021.07.05