UIResponder

나이든별 / Oldstar·2022년 7월 12일
0

Think about Keywords

목록 보기
35/37

공부한 것

  • UIResponder

고민한 점 및 생각해본 점

  • respond는 대답한다는 뜻이다. 그럼 UIResponder는 무엇에 대답하는 것일까?
    • 이벤트에 답하는 것이다. 여기서 이벤트는 터치나 모션, 원격 제어 등이 해당될 수 있다.
  • UIResponder에 관해 알아보며 가장 놀랐던 점 중 하나는, 모든 View Controller의 상위 클래스가 UIResponder라는 것이다.
    • 심지어 UIView, 더 심지어는 UIApplication 역시도 자식 클래스로 두고 있다는 것!
    • 놀랍지만, 한편으로는 유저의 '이벤트'에 응답해야 하는 것이 앱의 역할이기 때문에, 또한 당연하다고도 느껴졌다.
  • 특정 타입의 이벤트를 처리하려면, UIResponder는 해당 이벤트에 해당하는 메서드를 오버라이딩해야 한다.
  • UIResponder는 이벤트의 입력을 감지하면, 그것을 처리하거나, 다른 UIResponder 객체에 넘겨줘야 한다.
    • 앱은 이벤트를 받으면, 그것을 가장 적합하다고 여겨지는 'First Responder'에게 자동으로 넘겨준다.
  • 만약 이벤트가 처리되지 않는다면? Responder Chain을 통해 이 이벤트가 처리될 때까지 넘겨 준다.
    • 공식 문서에 따르면, UIView의 하위 클래스들 -> UIView -> UIViewController -> UIWindow -> UIApplication까지 이어진다.
    • AppDelegate에서 Responder Chain이 끝나는지 알 수 있다. AppDelegate 는 말 그대로 UIApplication의 대리자이기 때문!!!
    • 상술한 모든 것들이 UIResponder의 하위 클래스라는 점 또한 눈여겨볼 만 하다.
  • 공식 문서에서 말하는 이벤트의 종류는 터치, 프레스, 셰이크 모션, 리모트 컨트롤, 에디팅 메뉴가 있다.
    • 프레스가 좀 헷갈렸는데, 꾸욱 누르는 거라고 생각하면 될 것 같다..?
    • 터치 이벤트는 터치가 발생한 뷰에서, 프레스 이벤트는 프레스를 통해 포커스가 쏠린 오브젝트에서 핸들링하면 된다.
    • 리모트 컨트롤은, 이를테면, 에어팟 프로에서 기계를 조작하는 거라던지.
    • 에디팅 메뉴는 글자 꾹 누르면 나오는 설정 메뉴. 텍스트에서 많이 볼 수 있는 것. 붙여넣기 및 이동 같은 것!
    • 나머지 이벤트의 경우, 개발자 본인이나 UIKit이 지정한 객체에서 핸들링한다.
  • 액션 메시지라는 것을 통해, 컨트롤은 상응하는 오브젝트와 직접 통신한다.
    • 만약 해당 오브젝트가 nil이라면, 마찬가지로 UIKit은 Responder Chain을 통해 이 액션을 핸들링해줄 오브젝트를 찾아 헤맨다.
    • 액션 메시지는 이벤트는 아니지만, Responder Chain의 덕을 보는 셈..
    • cut, copy, paste 등의 메서드를 예시로 들더군.
  • Gesture Recognizer는 뷰보다 먼저 터치나 프레스 등의 이벤트를 인식한다.
    • UIKit과 한통속이기 때문에, 이 친구가 제스처를 인식해서 뷰 클래스에 전달한다고 보면 되겠다.
    • 뷰가 이것을 핸들링하지 않으면, 또 Responder Chain을 태워서.. 이하 생략.
  • UIKit은 어디에 터치가 일어났는지 알아내기 위해 뷰 기반의 힛-테스팅을 한다고 한다..?
    • 아! hitTest 메서드를 통해, 뷰 계층을 따라서, 해당 위치에 있는 뷰 중 가장 깊은 서브뷰를 고르면, 이게 바로 First Responder가 되게 한다고 한다.
    • 만약 터치된 위치가 뷰의 경계를 벗어난다면, 이 메서드는 해당 이벤트를 무시한다.
    • 터치가 발생하면, UIKitUITouch 객체를 생성한 다음 이것을 뷰와 엮는다. 터치가 발생할 때마다 새로운 UITouch 객체를 만들어서 뷰와 엮는다. 그리고 터치가 끝나면 이 객체를 없앤다.
  • UIResponder 객체에는 next 메서드가 있고, 이를 오버라이딩해줌으로써 Responder Chain의 순서를 조정할 수 있다.
  • Responder Chain을 태울지 말지, 얼마나 태울지는, 이벤트에 대응하는 동작이 얼마나 앱 내에서 공통적으로 사용되는지에 대해 생각해보면 되겠다.
    • 흔들었을 때 수행할 동작이 앱 내에서 다 동일하다면, AppDelegate에 도달할 때까지 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

profile
함께 나아가고자 하는 사람

0개의 댓글