티스토리 뷰

* 이 문서는 Apple Documentation을 번역한 문서입니다. 문제가 있을 경우 의견을 주시면 반영토록 하겠습니다.


Overview

앱은 responder 객체를 사용하여 이벤트를 받고 처리합니다. responder 객체는 UIResponder 클래스의 모든 인스턴스를 말하며, 공통 서브클래스는 UIViewUIViewController, and UIApplication 등이 포함됩니다. Responder는 원시 이벤트 데이터를 수신하고 이벤트를 처리하거나 다른 Responder로 전달해야합니다.  앱이 이벤트를 받고 있을 때, UIKit는 자동으로 해당 이벤트를 first responder 라고하는 가장 적합한 Responder 객체로 보냅니다. 처리되지 않은 이벤트는 responder에서 응용 프로그램 응답자 객체의 동적 구성 인 활성 응답자 체인의 응답자로 전달됩니다. 앱의 responder 객체의 동적인 구성인 활성 responder chain의 responder로 전달됩니다. 앱 내의 단일 responder chain은 존재하지 않습니다. UIKit는 객체가 하나의 responder에서 다음 responder로 어떻게 전달되는지에 대한 기본 규칙을 정의하고 있지만, responder의 적합한 속성을 오버라이딩하여 규칙을 변경할 수 있습니다.


Figure 1은 인터페이스에 label, text field, button 및 두 개의 백그라운드 view가 포함된 앱의 기본 responder chain을 보여줍니다. 만약 text field가 이벤트를 처리하지 않는다면, UIKit는 이벤트를 text field의 부모인 UIView 객체로 보내고, 그다음에는 윈도우의 root view로 보냅니다. 루트뷰에서 이벤트를 window로 보내기 전에, responder chain이 자기 자신의 뷰 컨트롤러로 전환됩니다. window가 이벤트를 처리하지 않으면, UIKit는 이벤트를 UIApplication 객체로 전달합니다. 해당 객체가 UIResponder의 인스턴스이고 responder chain의 일부가 아닌 경우 앱 델리게이트로 전달할 수 있습니다.

Figure 1 

Responder chains in an app

A flow diagram that shows how an event moves along the responder chain

Determining the First Responder for an Event

모든 이벤트의 타입에 대해, UIKit는 first responder를 지정하고, 해당 객체에 이벤트를 먼저 보냅니다. first responder는 이벤트 유형에따라 다릅니다.

Touch events

first responder는 터치가 발생한 view 입니다.

Press events

first responder는 포커스가 있는 응답자입니다.

Shake-motion events

first responder는 사용자 (또는 UIKit)가 first responder로 지정한 객체입니다.

Remote-control events

first responder는 사용자 (또는 UIKit)가 first responder로 지정한 객체입니다.

Editing menu messages

first responder는 사용자 (또는 UIKit)가 first responder로 지정한 객체입니다.


컨트롤은 액션 메시지를 사용하여 연결된 대상 객체와 직접 통신합니다. 사용자가 컨트롤과 상호 작용할 때 컨트롤은 대상 객체의 동작 메서드를 호출합니다. 즉, 대상 객체에 액션 메시지를 보냅니다. 액션 메시지는 이벤트는 아니지만 responder chain을 여전히 활용할 수 있습니다. 컨트롤의 대상 객체가 nil이면, UIKit는 대상 객체에서 시작하여 적절한 액션 메시지를 구현하는 객체를 찾을 때까지 responder chain을 조사합니다. 예를 들면, UIKit 편집 메뉴는 cut(_:)copy(_:), or paste(_:)와 같은 이름의 메소드를 구현하는 responder 객체를 찾기 위해 이 동작을 사용합니다.

view에 붙어있는 gesture recognizer가 있는 경우, view가 터치나 누름 이벤트를 받기 전에 gesture recognizer가 먼저 이벤트를 받습니다. 만약 view의 모든 gesture recognizer가 제스처를 인식하는데 실패한다면, 해당 이벤트는 처리를 위해 view에게 전달됩니다. view가 이벤트를 처리하지 않으면, UIKit는 responder chain 위로 이벤트를 전달합니다. gesutre recognizer를 이용하여 이벤트를 처리하는 방법에 대한 자세한 내용은 Handling UIKit Gestures를 참고하십시오.


Determining Which Responder Contained a Touch Event

UIKit는 view 기반의 hit-testing을 사용하여 터치 이벤트가 발생하는 위치를 결정합니다. 특히, UIKit는 터치 위치를 view 계층 구조 내 view의 bounds와 비교합니다. UIView 의 hitTest(_:with:)메소드는 지정된 터치를 포함하는 가장 깊은 하위 view를 찾기 위해 view의 계층 구조를 탐색합니다.

UIKit는 각 터치를 포함하는 view에 각 터치를 영구적으로 지정합니다. UIKit는 터치가 처음 발생할 때 각 UITouch 객체를 만들고 터치가 끝난 후에만 해당 객체를 해제합니다. 터치 위치 또는 다른 매개 변수가 변경되면 UIKit는 UITouch 객체를 새 정보로 업데이트합니다. 포함하는 view는 변경되지 않습니다. 터치 위치가 원본 view 외부로 이동하더라도, 터치의 view 속성은 변경되지 않습니다.

Altering the Responder Chain

responder 객체의 next 속성을 오버라이딩하여 responder chain을 변경할 수 있습니다. 이렇게하면, 다음 responder가 당신이 반환하는 객체가 됩니다.


많은 UIKit 클래스가 이미 이 속성을 오버라이딩하고 특정 객체를 반환합니다.

  • UIView 객체. view가 view controller의 루트 view인 경우, next responder는 view controller 입니다. 아닌경우, next responder는 view의 superview입니다.

  • UIViewController 객체.

    • view controller의 view가 window의 루트 view인 경우, next responder는 window 객체입니다.

    • view controller가 다른 view controller에 의해 present 되었다면, next responder는 presenting view controller 입니다.

  • UIWindow 객체. window의 next responder는 UIApplication 객레 입니다.

  • UIApplication 객체. next responder는 앱 델리게이트 이지만, 앱 델리게이트가 UIResponder의 인스턴스이고 view, view controller, 또는 앱 객체 자체가 아닌 경우에만 해당됩니다.


'iOS > Apple Document' 카테고리의 다른 글

UIWebView와 WKWebView  (2) 2018.03.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함