Responder Chain과 First Responder
이벤트를 받고 처리해주는 UIResponder
우리가 앱을 만들다보면 자주 접하게 되는 UIView를 자세히 뜯어다보면 UIResponder라는 객체를 상속받고 있다는 것을 알 수 있다.
UIResponder라는 친구는 이름에서 알 수 있듯이 이벤트를 받게 되면 이를 무조건 처리해야하며, 자신이 처리할 수 없는 경우에는 다른 UIResponder에게 넘겨서 처리하게끔 해준다.
위의 그림과 같이 UIResponder를 상속받는 객체는 UIView 외에도 UIViewController, UIApplication 등이 있으며 덕분에 이들도 여러 이벤트를 받고 처리할 수 있는 기능을 구현할 수 있는 것이다.
이와 같이 Responder가 이벤트를 받아서 처리하기 전, 이벤트를 제일 먼저 받는 객체가 있을 수 밖에 없다. First Responder는 직역 그대로 제일 먼저 이벤트를 받는 Responder 객체를 의미한다.
그렇다면 Responder Chain은 무엇일까? 이벤트를 제일 먼저 받는다고 해도 이를 처리해야 할 객체가 아닐 때, Responder는 어떤 행위를 할까? 위에서 말했듯이 다음 Responder 객체에게 이벤트를 넘길 것이고, 적합한 객체가 받을 때까지 이를 반복하는데 이를 Responder Chain이라고 한다.
First Responder의 결정
- 터치 이벤트 : 터치가 발생한 뷰
- 프레스 이벤트 : 포커스를 가진 뷰
- 흔들기 이벤트 : 사용자나 UIKit이 지정한 뷰
- 원격 이벤트 : 사용자나 UIKit이 지정한 뷰
- 편집 메뉴 이벤트 : 사용자나 UIKit이 지정한 뷰
가속도 센서, 자이로 센서, 자기장 센서 등에서 발생하는
이벤트의 경우에는 Responder Chain을 따르지 않고
지정된 객체로 바로 전달되며, 이를 처리하기 위해서는
Core Motion Framework를 사용해야 하니 주의!!
hitTest를 통한 이벤트 확인
UIKit 기반에서는 뷰는 hit-testing을 진행하여 이벤트가 발생한 위치를 확인한다. UIView가 가진 hitTest(_ with) 함수는 뷰 계층들을 탐색하면서 관련 이벤트를 가지고 있는 가장 깊은 계층의 뷰를 찾아내고 이를 반환하게 된다.
(이렇게 찾아낸 뷰는 해당 이벤트에 대한 Frist Responder가 된다)
Responder Chain 변경하기
next 프로퍼티를 오버라이드해서 다음번 Responder 객체를 변경하여 Responder Chain을 변경할 수 있다.
이외에도 다양한 수정 요소들이 있으니 이 부분들은 차근차근 알아보면 좋을 것 같다.
Author And Source
이 문제에 관하여(Responder Chain과 First Responder), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@wnsxor1993/Responder-Chain과-First-Responder저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)