Responder Chain과 First Responder

Zeto·2022년 3월 21일
0

Swift_Study

목록 보기
7/18

이벤트를 받고 처리해주는 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을 변경할 수 있다.

이외에도 다양한 수정 요소들이 있으니 이 부분들은 차근차근 알아보면 좋을 것 같다.

profile
중2병도 iOS가 하고싶어

0개의 댓글