[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로 확인할 수 있다.

  1. UITouchBegan : 손가락이 View에 닿은 단계
  2. UITouchMoved: 손가락이 닿은 View 혹은 인접한 다른 View에서 이동 중인 단계
  3. 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을 따라 계속 전달되어진다.

TouchEventDelivery.png

To Handle Events You Must Override Four Methods

CustomView, Custom ViewController등 Responder 객체는 UIResponder 클래스에서 정의한

4가지 메소드를 구현하여 Touch 이벤트를 처리할 수 있다.

  1. touchesBegan(_:with:) : Began phase의 터치 객체에 대해 호출
  2. touchesMoved(_:with:) : Move phase의 터치 객체에 대해 호출
  3. touchesEnded(_:with:) : End phase의 터치 객체에 대해 호출
  4. touchesCancelled(_:with:) : 전화 수신과 같은 외부 이벤트에 의해 OS가 멀티-터치-시퀀스에서 UITouch 객체를 취소하도록 할 때 호출

사용자 정의 View/ ViewController는 4가지 메소드를 모두 정의해야 하지만

View / ViewController를 서브 클래싱하면 관심 있는 이벤트에 대한 메소드만 구현해도 된다.

단, 이때는 상위 클래스의 메소드를 먼저 호출해야 함

참고

Apple

태그:

카테고리:

업데이트:

댓글남기기