[Apple] Handling UIKit Gestures

J.Noma·2021년 12월 26일
0

iOS : 이벤트 처리

목록 보기
1/8

Apple문서: Handling UIKit Gestures


학습목표

  • Gesture Recognizer를 사용하여 터치를 비롯한 event들을 처리하는 방법에 대해 이해합니다
  • discrete/continuous Gesture의 차이를 이해합니다

🐶 Overview

view에 Gesture Recognizer 연결
Gesture Recognizer는 touch/press 이벤트를 처리하는 가장 간단한 방법입니다. 어떤 view에 하나 이상의 Gesture Recognizer를 붙일 수 있습니다.

Gesture Recognizer의 역할
Gesture Recognizer는 이벤트 처리에 필요한 모든 로직을 캡슐화하고, view로 들어오는 이벤트를 해석하고, 어떤 제스쳐 패턴인지 매칭합니다. 어떤 패턴과 매칭되면 gesture recognizer는 이 이벤트를 처리할 target에게 알립니다 (target은 뷰컨, 뷰, 혹은 다른 객체가 될 수 있습니다)

target-action 디자인 패턴
Gesture Recognizer는 이 알림을 보내기 위해 target-action 디자인 패턴을 사용합니다. 예로, UITapGestureRecognizer 객체가 어떤 view에 탭이 발생했음을 감지하면, 해당 view의 뷰컨에 구현된 action 메서드를 호출합니다. 이 action 메서드를 통해 응답을 제공하게 됩니다

Gesture Recognizer에는 discrete 타입과 continuous 타입이 있습니다
Gesture Recognizer의는 discrete/continuous 두 가지 타입이 존재합니다

Discrete Gesture Recognizer는 tap같은 단발성 제스쳐들에 대한 Gesture Recognizer입니다. discrete Gesture Recognizer는 최초에 제스쳐가 인지된 후 '한 번만' action 메서드가 호출됩니다.

반면, Continuous Gesture Recognizer는 rotation처럼 지속성있는 제스쳐들에 대한 Gesture Recognizer입니다. Continuous Gesture Recognizer는 제스쳐가 인지된 시점부터 이벤트 정보(ex. 터치 위치)가 변경될 때마다 매번 action 메서드를 호출합니다. 예로, UIPanGestureRecognizer는 터치 위치가 바뀔 때마다 action 메서드를 호출합니다

Interface Builder는 표준 UIKit gesture recognizer 객체를 두 타입 모두 가지고 있습니다. 또한, UIGestureRecognizer를 상속하여 사용하는 Custom gesture recognizer도 제공합니다


🐱 Gesture Recognizer 설정하기

특정 view에 Gesture Recognizer를 설정하기 위해서는,

1. 스토리보드에서 Gesture Recoginzer를 원하는 view로 드래그합니다

2. Gesture가 인식될 때 호출될 action 메서드를 구현합니다

//예시코드
@IBAction func myActionMethod(_ gesture: UITapGestureRecognizer)
//참고로, 파라미터 타입은 UITapGestureRecognizer의 subclass도 가능합니다

3. 구현한 action 메서드를 Gesture Recognizer에 연결합니다

이 연결을 만들기 위해, Interface Builder에서 Gesture Recognizer를 우클릭 후 'Sent Actions'에서 action 메서드를 구현해놓은 객체로 연결하면 됩니다. 이 연결을 코드로 설정하려면 Gesture Recognizer의 addTarget(_:action:)메서드를 사용할 수도 있습니다.


🐭 제스쳐에 반응하기

Gesture Recognizer에 action 메서드를 연결함으로써 App이 제스쳐에 반응할 수 있게 만들 수 있습니다

discrete/continuous 타입
discrete 타입 제스쳐에 대한 action 메서드는 버튼의 action 메서드와 유사합니다. 제스쳐가 인식되어 action 메서드가 호출되면 해당 제스쳐에 적절한 어떤 작업이든 수행할 수 있습니다

continuous 타입 제스쳐에 대한 action 메서드도 제스쳐 인식에 반응할 수 있습니다. 동시에 제스쳐가 인식되기 전에도 event를 추적할 수 있습니다. 이렇게 event를 추적하는 것은 좀 더 상호작용적인 경험을 만들 수 있게 해줍니다. 예로, content를 재배치하기 위해 UIPanGestureRecognizer 객체의 업데이트를 사용할 수도 있습니다

state 프로퍼티
Gesture Recognizer의 state 프로퍼티는 제스쳐 인식에 대한 현재 상태를 전달합니다. continuous 제스쳐에 대해 Gesture Recognizer는 UIGestureRecognizer.Statebegan/changed/ended/cancelld로 업데이트합니다.

action 메서드에서 이 프로퍼티를 사용하여 어떤 코드를 수행할지 결정할 수 있습니다. 예로, action 메서드 내에서 'began'과 'changed'일 때는 content의 일시적인 변화를 주고, 'ended'일 때는 영구적으로 변화를 준다던지 할 수 있습니다. 그러므로 action을 취하기 전에 적절한 action을 결정할 수 있도록 state 메서드를 확인해야 합니다. state와 각 state별 메서드에 대해 더 알고 싶다면 Implementing a Custom Gesture Recognizer를 참고합니다

제스쳐 별 처리 방법 예시

profile
노션으로 이사갑니다 https://tungsten-run-778.notion.site/Study-Archive-98e51c3793684d428070695d5722d1fe

0개의 댓글