ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Responder Chain / Touch Event
    iOS 2021. 2. 22. 18:04

    안녕하세요. 그린입니다!

    이번 포스팅에서는 Responder Chain / Touch Event에 대해 알아보겠습니다.

     

    • Responder란?

     : 이벤트를 핸들링하고 반응할 수 있는 객체

     : 모든 Resonder 객체는 UIResponder에서 상속된 클래스의 인스턴스

     : 이벤트 발생 시 이벤트 처리를 위해 해당 이벤트를 앱의 Responder 객체에 전달

     : UIKit에 정의된 UIResponder 클래스

    • 이벤트 종류

     : Touch / Press / Shake-motion / Remote-control / Editing menu

     : responder가 해당 이벤트에 맞는 메서드를 오버라이드해서 구현해야함

     

    • Responder Chain

     : responder 객체들이 이벤트나 액션 메시지를 핸들링해야될것을 앱 내 타 객체에 전송하도록 도와줌
       (정해진 responder가 해당 이벤트를 핸들링하지 않을때, responder chain의 타 객체로 포워딩)

     : 이벤트는 처리될때까지 responder chains의 상위 객체로 이동 (끝까지 처리 안될 시 소멸) // next responder 프로퍼티 이용

     

    • 이벤트 경로

     : responder chain은 기본적으로 이벤트라면 뷰(first responder) -> 뷰 계층 -> window 객체 -> App 객체

     : View -> SuperView 포워딩 / rootView -> VC 포워딩

     : UIKit가 규칙에 따라 responder chain을 동적 관리

     

     

    • First Responder?

     : 이벤트를 처음으로 받는 resonder 객체

     : 앱이 이벤트가 발생하면 UIKit가 해당 이벤트 처리에 맞는 first responder인 responder 객체로 보냄

       (받은 이벤트 종류에 따라 구분하여 특정 객체를 맞는 이벤트의 first responder로 지정)

     : first responder가 되어 이벤트를 받기 위해 responder는 UIResponder 서브클래스에서 canBecomeFirstResponder

       프로퍼티를 오버라이드해 true를 리턴하도록 구현해야함

     : 타겟 객체 / 액션 메시지를 이용해 컨트롤

     : 이벤트 컨트롤의 타겟 객체가 nil일 시, responder chain을 이용해 액션 메시지 구현된 객체가 나올때까지 이동

     

    • Touch Event

     : responder는 터치의 변화를 추적하고 인터페이스를 업데이트 하기 위해 UIKit에서 제공하는 이벤트 정보 이용

     : 터치 발생 시 뷰 기반 hit-testing을 사용 (hitTest(_:with:)) 메서드

     : 터치 위치를 뷰 계층에 있는 뷰 객체의 바운드와 비교

     

    • Touch 처리 단계
    1. Hit Testing
      : 터치 발생 시 어느 뷰에서 발생 했는지 탐색하여 해당 뷰에게 이벤트 객체를 전달
    2. 이벤트 처리
      : UIResponder / UIEvent / UITouch 클래스에서 전달되어 처리
    3. UIResponder
      : 이벤트 처리 객체가 들어있는 클래스

     : touches는 Set 타입 (터치 이벤트 발생시킨 터치 정보) / event는 UIEvent 타입 (터치 이벤트 속한 이벤트 정보)

        4. UIEvent

          : 이벤트 객체가 타입별로 이벤트 발생 시 생성되어 responder 객체에 전달

          : 이벤트 객체는 재사용됨

        5.UITouch
          : 터치 이벤트 발생 시 이벤트 객체와 동시에 발생 터치에 관한 정보를 담는 UITouch 객체 생성
          : view, window 프로퍼티 / location / majorRadius / force / tapCount / timeStamp 정보 등등..
          : 객체는 재사용되기에 다르게 사용하려면 객체를 복사하여 사용해야함

     

    • UIControl 
      : addTarget(_:action:for:) 메서드로 이벤트와 액션을 연결하여 처리해줌

    [참고자료]

    https://seizze.github.io/2019/11/26/iOS의-Responder와-Responder-Chain-이해하기.html

    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/library/archive/documentation/General/Conceptual/Devpedia-CocoaApp/Responder.html

    https://baked-corn.tistory.com/129

    'iOS' 카테고리의 다른 글

    View Drawing Cycle  (0) 2021.03.15
    iOS File System  (0) 2021.02.25
    의존성 관리도구  (0) 2021.02.18
    CoreData  (0) 2021.02.15
    KeyChain  (4) 2021.02.01
Designed by Tistory.