[iOS] Event
개요
iOS에서 Event는 손가락으로 View를 터치하거나 기기를 흔드는 행동을 말함
iPhone의 Multi-Touch 시스템은 하나 이상의 손가락이 하나 이상의 View에서 터치를 시작하고 손가락을 떼는
터치를 Event로 등록한 다음, 처리를 위해 현재 활성화 된 어플리케이션으로 전달한다
View를 터치하는 순간부터 손가락을 땔 때까지 가능한 터치의 범위를 멀티-터치-시퀀스로 정의한다
Application 객체( + Framework 객체도)는 핀치, 스와이프 같은 제스처 인지 확인하기 위해 이런
멀티-터치-시퀀스를 분석한다
Object Represent Fingers Touching a View
View를 터치하는 손가락은 UITouch 클래스로 표현된다.
UITouch 클래스는 손가락이 터치하는 View, View에서 터치된 위치, 타임 스탬프(터치된 시간), Phase와 같은 정보가 포함되어있다.
UITouch의 객체는 멀티-터치-시퀀스 동안 주어진 순서에 따라 여러 단계를 거치는데 이 단계의 정보가 바로 Phase로 확인할 수 있다.
- UITouchBegan : 손가락이 View에 닿은 단계
- UITouchMoved: 손가락이 닿은 View 혹은 인접한 다른 View에서 이동 중인 단계
- UITouchEnded: 손가락이 View에서 떼어진 단계
UITouch 객체는 정지 단계 혹은 취소될 수도 있다
UITouch 객체는 멀티-터치-시퀀스를 통해 (인스턴스가) 계속 유지되고 그 동안 state는 계속 변경될 수 있음
The Delivery of Touch objects Follow a Defined Path
Main Event Loop에서 Application 객체는 Event Queue에서 raw touch event(Low 유저 Event)를 가져와서 UIEvent 객체를 만들고, 그 안에 UITouch 객체를 패키징하여 터치가 발생한 View의 Window 객체로 전달한다.
UITouch 클래스를 바로 전달하는게 아니라 UITouch객체를 UIEvent 객체로 랩핑해서 보낸다는 것
Window 객체는 전달 받은 UIEvent 객체를 Hit-Test View라고 하는 View로 전달한다
Hit-Test View는 아마 HitTest 후 찾은 View를 말하는 것 같음
UIEvent를 전달받은 View가 이벤트를 처리할 수 없는 경우 ( 대부분의 경우 이벤트를 처리하기 위한 메소드를 구현하지 않은 경우이다) 에는 UIEvent객체는 처리되거나 삭제될 때 까지 Responder Chain을 따라 계속 전달되어진다.
To Handle Events You Must Override Four Methods
CustomView, Custom ViewController등 Responder 객체는 UIResponder 클래스에서 정의한
4가지 메소드를 구현하여 Touch 이벤트를 처리할 수 있다.
- touchesBegan(_:with:) : Began phase의 터치 객체에 대해 호출
- touchesMoved(_:with:) : Move phase의 터치 객체에 대해 호출
- touchesEnded(_:with:) : End phase의 터치 객체에 대해 호출
- touchesCancelled(_:with:) : 전화 수신과 같은 외부 이벤트에 의해 OS가 멀티-터치-시퀀스에서 UITouch 객체를 취소하도록 할 때 호출
사용자 정의 View/ ViewController는 4가지 메소드를 모두 정의해야 하지만
View / ViewController를 서브 클래싱하면 관심 있는 이벤트에 대한 메소드만 구현해도 된다.
단, 이때는 상위 클래스의 메소드를 먼저 호출해야 함
댓글남기기