-
Responder Chain / Touch EventiOS 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 처리 단계
- Hit Testing
: 터치 발생 시 어느 뷰에서 발생 했는지 탐색하여 해당 뷰에게 이벤트 객체를 전달 - 이벤트 처리
: UIResponder / UIEvent / UITouch 클래스에서 전달되어 처리 - 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
'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