Responder Chain과 First Responder

Jee.e·2022년 3월 21일
0

Responder

• 이벤트를 핸들링하고, 이벤트에 반응
• 이벤트 발생 시, UIKit은 이벤트 핸들링을 위해 해당 이벵트를 앱의 responder 객체들에게 보냄
• 모든 responder 객체는 UIResponder에서 상속된 클래스의 인스턴스
• 예로 UIApplication, UIViewController, 모든 UIView (UIWindow 객체 포함) 이 있다.
• 이벤트 메시지들을 받는 것 이외에, responder는 target이 특정되지 않은 액션 메시지들을 받을 수도 있다.
• 첫번째로 이벤트를 받는 객체를 first responder 라고 한다.


✅ 이벤트를 핸들링 하기 위해서는?

• responder가 해당 이벤트에 대응되는 메서드를 오버라이드해 구현해야함
• responder는 터치의 변화를 트래킹하고 앱의 UI를 적절히 업데이트 하기 위해 UIKit에서 제공하는 이벤트 정보를 이용

touchesBegan(_:with:)
touchesMoved(_:with:)
touchesEnded(_:with:)
touchesCancelled(_:with:) 



Responder Chain

• 이벤트에 따라 누가 받을지 체인으로 연결
• 이벤트를 받기 위해서는, responder는 자신이 first responder가 될 수 있음을 나타내야함
first responder 를 시작으로 해당 responder가 이벤트를 핸들링하지 않을 경우, 그 이벤트를 Responder Chain에 연결되어 있는 다음 객체에게 포워딩 함 (이벤트 처리할 적절한 객체 찾기)
• 메세지가 처리될 때까지 Chain의 상위 객체로 이동 (마지막까지 처리되지 않는경우, 메세지 버림)




First Responder

• 첫번째로 이벤트를 받는 객체
• 이벤트를 처리하기에 가장 적절한 Responder

✅ first responder 설정 ?

UIResponder의 서브클래스에서 canBecomeFirstResponder 프로퍼티를 오버라이드하여 true를 리턴하도록 만들어야 한다.
또, UIKit은 받은 이벤트의 종류에 따라 특정 객체를 해당 이벤트의 first responder 로 지정하기도 한다.

Event typeFirst responder
Touch터치가 일어난 뷰
Press포커스를 가진 뷰
Shake-motionUIKit이 지정한 객체 또는 직접 지정
Remote-control eventsUIKit이 지정한 객체 또는 직접 지정
Editing menu messagesUIKit이 지정한 객체 또는 직접 지정

hit-test
터치 이벤트 발생 시, UIKit은 이벤트가 발생한 뷰를 찾기 위해 hit-test 를 사용한다.
터치를 포함하는 뷰 계층을 찾아, 해달 계층의 제일 깊은 곳에 위치한 서브뷰를 찾고 first responder 로 지정한다.
이후 First Responder가 해당 이벤트를 처리하지 못하는 경우, Responder Chain 을 따라 이벤트를 보낸다.
( disabled 상태이거나 / 투명도가 0.01 미만인 상태의 서브뷰는 무시된다. )




참고 문서
https://seizze.github.io/2019/11/26/iOS%EC%9D%98-Responder%EC%99%80-Responder-Chain-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0.html

profile
나는 지이!

0개의 댓글