UIResponder
UIResponder
는 무엇에 대답하는 것일까?UIResponder
에 관해 알아보며 가장 놀랐던 점 중 하나는, 모든 View Controller의 상위 클래스가 UIResponder
라는 것이다.UIView
, 더 심지어는 UIApplication
역시도 자식 클래스로 두고 있다는 것!UIResponder
는 해당 이벤트에 해당하는 메서드를 오버라이딩해야 한다.UIResponder
는 이벤트의 입력을 감지하면, 그것을 처리하거나, 다른 UIResponder
객체에 넘겨줘야 한다.UIView
의 하위 클래스들 -> UIView
-> UIViewController
-> UIWindow
-> UIApplication
까지 이어진다.AppDelegate
에서 Responder Chain이 끝나는지 알 수 있다. AppDelegate
는 말 그대로 UIApplication
의 대리자이기 때문!!!UIResponder
의 하위 클래스라는 점 또한 눈여겨볼 만 하다.UIKit
이 지정한 객체에서 핸들링한다.nil
이라면, 마찬가지로 UIKit
은 Responder Chain을 통해 이 액션을 핸들링해줄 오브젝트를 찾아 헤맨다.cut
, copy
, paste
등의 메서드를 예시로 들더군.UIKit
과 한통속이기 때문에, 이 친구가 제스처를 인식해서 뷰 클래스에 전달한다고 보면 되겠다.UIKit
은 어디에 터치가 일어났는지 알아내기 위해 뷰 기반의 힛-테스팅을 한다고 한다..?hitTest
메서드를 통해, 뷰 계층을 따라서, 해당 위치에 있는 뷰 중 가장 깊은 서브뷰를 고르면, 이게 바로 First Responder가 되게 한다고 한다.UIKit
은 UITouch
객체를 생성한 다음 이것을 뷰와 엮는다. 터치가 발생할 때마다 새로운 UITouch
객체를 만들어서 뷰와 엮는다. 그리고 터치가 끝나면 이 객체를 없앤다.UIResponder
객체에는 next
메서드가 있고, 이를 오버라이딩해줌으로써 Responder Chain의 순서를 조정할 수 있다.UIKit
이 제공하는 스탠다드 뷰로 뷰를 짤 때 누릴 수 있다. 하지만 완전 커스텀 뷰를 만들고 싶다면? 이 이벤트들에 대한 핸들링을 하나하나 해 주어야 한다!!https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/using_responders_and_the_responder_chain_to_handle_events
https://developer.apple.com/documentation/uikit/uiresponder
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures