Using Responders and the Responder Chain to Handle Events

Groot·2022년 8월 24일
0

TIL

목록 보기
34/148
post-thumbnail

TIL

🌱 난 오늘 무엇을 공부했을까?

📌 Using Responders and the Responder Chain to Handle Events 공식문서 정리

  • 앱을 통해 전파되는 이벤트를 처리하는 방법

📍 앱의 Responder Chain

  • 이벤트 수신 시 UIKit이 가장 먼저 하는일은 자동으로 해당 이벤트를 가장 적절한 Responder 객체로 보내는 것.
  • 인터페이스에 레이블, 텍스트 필드, 버튼 및 두 개의 배경 View가 포함된 앱의 Responder 다이어그램
  • UILabel, TextField, Button 들이 이벤트를 처리하지 않으면 부모 UIView로 이벤트 객체를 보낸다.
  • 부모 UIView는 Root View로 객체를 전달한다.
  • Root View는 ViewController를 통해서 Window에 전달한다.
  • window가 처리하지 못하면 UIKit은 이벤트를 UIApplication 개체에 전달한다.
  • 해당 객체가 UIResponder(이벤트에 응답하고 처리하기 위한 추상 인터페이스입니다.)의 인스턴스이고 아직 responder chain의 일부가 아닌 경우 앱 대리자에게 가능하다.

📍 Determining an Event's First Responder

  • UIKit은 해당 이벤트의 유형에 따라 이벤트에 대한 첫 번째 Responder로 개체를 지정합니다.
  • 이벤트 유형
Event typeFirst responder
Touch eventsThe view in which the touch occurred.
Press eventsThe object that has focus.
Shake-motion eventsThe object that you (or UIKit) designate.
Remote-control eventsThe object that you (or UIKit) designate.
Editing menu messagesThe object that you (or UIKit) designate.

가속도계, 자이로스코프 및 자력계와 관련된 모션 이벤트는 Responder 체인을 따르지 않습니다.
대신 Core Motion은 해당 이벤트를 지정된 개체에 직접 전달합니다. 자세한 내용은 코어 모션 프레임워크를 참조하십시오.

  • 컨트롤은 작업 메시지를 사용하여 연결된 대상 개체와 직접 통신합니다.
  • 사용자가 컨트롤과 상호 작용할 때 컨트롤은 대상 개체에 작업 메시지를 보냅니다.
  • 작업 메시지는 이벤트가 아니지만 여전히 Responder 체인을 활용할 수 있습니다.
  • 컨트롤의 대상 개체가 nil이면 UIKit은 대상 개체에서 시작하여 적절한 작업 메서드를 구현하는 개체를 찾을 때까지 Responder 체인을 통과합니다.
  • 예를 들어 UIKit 편집 메뉴는 이 동작을 사용하여 cut(:), copy(:) 또는 paste(_:)와 같은 이름을 가진 메서드를 구현하는 Responder 개체를 검색합니다.
  • Gesture recognizers는 view보다 먼저 터치 및 누르기 이벤트를 수신합니다.
  • View가 터치를 처리하지 않으면 UIKit은 Responder 체인으로 터치를 전달합니다.
  • 제스처 인식기를 사용하여 이벤트를 처리하는 방법에 대한 자세한 내용은 UIKit 제스처 처리를 참조하세요.

📍 Determining Which Responder Contained a Touch Event

  • UIKit은 View 기반 적중 테스트를 사용하여 터치 이벤트가 발생하는 위치를 결정합니다. 특히 UIKit은 터치 위치를 View 계층 구조의 View 객체 경계와 비교합니다.

  • UIView의 hitTest(_:with:) 메서드는 View 계층을 순회하여 터치 이벤트에 대한 첫 번째 Responder가 되는 지정된 터치를 포함하는 가장 깊은 하위 View를 찾습니다.

    터치 위치가 View의 범위를 벗어나면 hitTest(:with:) 메서드는 해당 View와 모든 하위 View를 무시합니다.
    결과적으로 View의 clipsToBounds 속성이 false이면 해당 View의 경계를 벗어난 하위 View는 터치를 포함하더라도 반환되지 않습니다.
    적중 테스트 동작에 대한 자세한 내용은 UIView의 hitTest(
    :with:) 메서드에 대한 설명을 참조하세요.

  • 터치가 발생하면 UIKit은 UITouch 객체를 생성하고 이를 View와 연결합니다.

  • 터치 위치 또는 기타 매개변수가 변경되면 UIKit은 동일한 UITouch 객체를 새 정보로 업데이트합니다.

  • 변경되지 않는 유일한 속성은 View입니다. (터치 위치가 원래 View 외부로 이동하더라도 터치의 View 속성 값은 변경되지 않습니다.) 터치가 종료되면 UIKit은 UITouch 객체를 해제합니다.

📍 Altering the Responder Chain

  • Responder 개체의 다음 속성을 재정의하여 Responder 체인을 변경할 수 있습니다. 이렇게 하면 다음 Responder는 반환하는 개체입니다.
  • 많은 UIKit 클래스는 이미 이 속성을 재정의하고 다음을 포함한 특정 개체를 반환합니다.
  • UIView objects. View가 View 컨트롤러의 루트 View인 경우 다음 Responder는 View 컨트롤러입니다. 그렇지 않으면 다음 Responder는 View의 슈퍼View입니다.
  • UIViewController objects.
    • View 컨트롤러의 View가 창의 루트 View인 경우 다음 Responder는 창 개체입니다.
    • View 컨트롤러가 다른 View 컨트롤러에 의해 제공된 경우 다음 Responder는 프레젠테이션하는 View 컨트롤러입니다.
  • UIWindow objects. window의 다음 Responder는 UIApplication 개체입니다.
  • UIApplication object. 다음 Responder는 앱 대리자이지만 앱 대리자가 UIResponder의 인스턴스이고 View, View 컨트롤러 또는 앱 개체 자체가 아닌 경우에만 가능합니다.
    Using Responders and the Responder Chain to Handle Events공식문서
profile
I Am Groot

0개의 댓글