UIGestureRecognizer

Panther·2021년 7월 31일
0

https://developer.apple.com/documentation/uikit/uigesturerecognizer

"The base class for concrete gesture recognizers."

구체화된 제스쳐 리코그나이저들의 베이스 클래스입니다.

Declaration

@MainActor class UIGestureRecognizer : NSObject

Overview

gesture-recognizer 객체 혹은 간단하게 제스쳐 리코그나이저는 터치의 연쇄(혹은 다른 입력)를 인식하는 로직과 해당 인식에 대한 액션 로직을 분리합니다. 이 객체들 중 한 가지가 일반적인 제스쳐를 인식하거나 제스쳐의 변경을 인식할 때, 지정된 각각의 목표 객체에 액션 메시지를 보냅니다.

UIGestureRecognizer의 구체화된 서브클래스는 아래와 같습니다.

  • UITapGestureRecognizer
  • UIPinchGestureRecognizer
  • UIRotationGestureRecognizer
  • UISwipeGestureRecognizer
  • UIPanGestureRecognizer
  • UIScreenEdgePanGestureRecognizer
  • UILongPressGestureRecognizer
  • UIHoverGestureRecognizer

UITapGestureRecognizer
https://developer.apple.com/documentation/uikit/uitapgesturerecognizer
https://velog.io/@panther222128/UITapGestureRecognizer

UIPinchGestureRecognizer
https://developer.apple.com/documentation/uikit/uipinchgesturerecognizer
https://velog.io/@panther222128/UIPinchGestureRecognizer

UIRotationGestureRecognizer
https://developer.apple.com/documentation/uikit/uirotationgesturerecognizer
https://velog.io/@panther222128/UIRotationGestureRecognizer

UISwipeGestureRecognizer
https://developer.apple.com/documentation/uikit/uiswipegesturerecognizer
https://velog.io/@panther222128/UISwipeGestureRecognizer

UIPanGestureRecognizer
https://developer.apple.com/documentation/uikit/uipangesturerecognizer
https://velog.io/@panther222128/UIPanGestureRecognizer

UIScreenEdgePanGestureRecognizer
https://developer.apple.com/documentation/uikit/uiscreenedgepangesturerecognizer
https://velog.io/@panther222128/UIScreenEdgePanGestureRecognizer

UILongPressGestureRecognizer
https://developer.apple.com/documentation/uikit/uilongpressgesturerecognizer
https://velog.io/@panther222128/UILongPressGestureRecognizer

UIHoverGestureRecognizer
https://developer.apple.com/documentation/uikit/uihovergesturerecognizer
https://velog.io/@panther222128/UIHoverGestureRecognizer

UIGestureRecognizer 클래스는 모든 구체화된 제스쳐 리코그나이저에서 설정될 수 있는 일반적인 행동의 집합을 정의합니다. 또한, 이 객체의 딜리게이트(UIGestureRecognizerDelegate 프로토콜을 채택하는 객체)와 소통할 수 있습니다. 그렇게 함으로써 몇 가지 동작의 finer-grained 커스터마이징을 가능하게 합니다.

제스쳐 리코그나이저는 특정 뷰 및 해당 뷰의 하위뷰 모두에 대해 touches hit-tested에서 작동합니다. 이와 같은 연관성을 만드려면, UIView 메소드 addGestureRecognizer(_:)를 호출해야 합니다. 제스쳐 리코그나이저는 뷰의 리스폰더 체인에 참여하지는 않습니다.

제스쳐 리코그나이저는 하나 혹은 하나 이상의 target-action 쌍이 연결되어 있습니다. 만약 여러 쌍이 존재하는 경우 이들은 이산적이며, 누적되는 형태가 아닙니다. 제스쳐의 인식은 연관된 쌍 각각에 대한 목표에 액션 메시지를 전송합니다. 호출된 액션 메소드는 아래 시그니처 중 한 가지를 따르고 있어야 합니다.

@IBAction func myActionMethod()
@IBAction func myActionMethod(_ sender: UIGestureRecognizer)

후자 시그니처를 따르는 메소드는 몇 가지 경우, 목표가 추가적인 정보에 대한 메시지를 보내는 제스쳐 리코그나이저에 쿼리하는 것을 허용합니다. 예를 들어 목표는 제스쳐에 대한 액션 메소드의 마지막 호출 이후 회전 (라디언 단위)의 각도를 UIRotationGestureRecognizer 객체에게 요청할 수 있습니다. 제스쳐 리코그나이저의 클라이언트 역시 location(in:) 혹은 location(ofTouch:in:)를 호출함으로써 제스쳐의 위치를 요청할 수 있습니다.

제스쳐 리코그나이저에 의해 해석된 제스쳐는 이산적인 형태가 될 수도 있고 연속적인 형태가 될 수 있습니다. 더블 탭처럼 이산적인 제스쳐는 다중 터치 연쇄에서 한 번 발생하고, 단일 액션만 보내는 결과를 보일 것입니다. 그러나 제스쳐 리코그나이저가 회전 제스처처럼 연속적인 제스처로 인식할 때, 이는 다중 터치 연쇄가 끝나기까지 변경사항의 수가 늘어남에 따라 그에 비례해서 액션 메소드를 전송합니다.

윈도우는 제스처 리코그나이저에 있는 hit-tested 뷰에 터치 이벤트를 전달하기 전에, 제스처 리코그나이저에게 터치 이벤트를 전달합니다. 일반적으로 만약 제스처 리코그나이저가 다중 터치 연쇄에서 터치의 흐름을 분석하고 제스처를 인식하지 않는다면, 뷰는 터치의 전체적인 보완을 받습니다. 만약 제스처 리코그나이저가 제스처를 인삭하면, 뷰에 남아있는 터치는 취소됩니다. 제스쳐 인식에서 액션의 연쇄는 cancelsTouchesInView, delaysTouchesBegan, delaysTouchesEnded 속성의 기본값으로 결정되는 경로를 따라갑니다.

  • cancelsTouchesInView—만약 제스쳐 리코그나이저가 제스처를 인식하면, 뷰로부터 해당 제스쳐의 남아있는 터치를 해제합니다(이렇게 되면 윈도우는 터치를 전달하지 않습니다). 윈도우는 이전에 전달된 터치를 메시지(touchesCancelled(_:with:))와 함께 취소합니다.
  • delaysTouchesBegan—터치 이벤트를 분석할 때 제스처 리코그나이저가 제스처 인식을 실패하지 않는 한, 윈도우는 UITouch.Phase.began 페이즈 단계에 있는 터치 객체를 뷰에 전달하는 것에 대해 보류합니다. 만약 제스쳐 리코그나이저가 제스쳐를 후속적으로 인식하게 되는 경우 뷰는 이러한 터치 객체들을 받지 않습니다. 만약 제스쳐 리코그나이저가 제스쳐를 인식하지 않을 경우 윈도우는 이 객체들을 뷰의 touchesBegan(:with:) 메소드 호출에서 전달합니다(터치의 현재 위치를 알릴 수 있도록 해주는 touchesMoved(:with:) 호출도 가능합니다).
  • delaysTouchesEnded—터치 이벤트를 분석할 때 제스쳐 리코그나이저가 제스처의 인식을 실패하지 않는 한, 윈도우는 UITouch.Phase.ended 페이즈 단계에 있는 터치 객체를 뷰에 전달하는 것에 대해 보류합니다. 만약 제스쳐 리코그나이저가 제스쳐를 후속적으로 인식하게 되는 경우 터치는 취소됩니다(touchesCancelled(:with:) 메시지에서). 만약 제스쳐 리코그나이저가 제스쳐를 인식하지 않으면, 윈도우는 뷰의 touchesEnded(:with:) 메소드 호출에서 이 객체들을 전달합니다.

앞서 설명한 내용에서 "recognize"는 Recognized 상태로의 전환과 동일할 필요는 없습니다.

Subclassing Notes

구분되는 제스쳐를 인식하는 UIGestureRecoginzer의 서브클래스를 생성할 것입니다. 예를 들어 "checkmark" 제스쳐가 있습니다. 만약 구체화된 제스쳐 리코그나이저를 생성하려고 한다면, UIGestureRecognizerSuvclass.h 헤더 파일 임포트를 확실하게 해야 합니다. 이 헤더 파일은 서브클래스가 오버라이드, 호출, 재설정해야 하는 모든 메소드와 속성을 선언합니다.

제스쳐 리코그나이저는 상태 머신이 다중 터치 이벤트를 처리할 때 후속 성태를 전환 시키는, 사전에 정의된 상태 머신에서 작동합니다. 상태와 가능한 전환은 연속적 제스쳐와 이산적 제스쳐마다 다릅니다. 모든 제스쳐 리코그나이저는 Possible 상태(UIGestureRecognizer.State.possible)에서 다중 터치 연쇄를 시작합니다. 이산적 제스쳐는 Possible에서 Recognized(recognized) 혹은 Failed로 전환합니다. 만약 제스쳐 리코그나이저가 Recognized로 전환되는 경우 목표에 액션 메시지를 보냅니다. 연속적 제스쳐의 경우 아래 다이어그램에서 보이는 것처럼 제스쳐 리코그나이저가 만드는 상태 전환은 더 다양합니다.

  • Possible ----> Began ----> [Changed] ----> Cancelled
  • Possible ----> Began ----> [Changed] ----> Ended

변경된 상태는 옵셔널입니다. 그리고 Cancelled 혹은 Ended 상태에 도달하기 전에 여러번 발생할 것입니다. 제스쳐 리코그나이저는 각 상태 전환마다 액션 메시지를 보냅니다. 그러므로 핀치와 같은 연속적 제스쳐의 경우 액션 메시지들은 두 손가락이 각각을 향하거나 멀어지게될 때 보내집니다. 이 상태를 나타내는 열거형 상수들은 UIGestureRecognizer.State의 타입입니다. (Recognized와 Ended 상태에 대한 상수들은 동의어라는 점을 알아야 합니다.)

서브클래스는 상태 사이에서 전환이 발생할 때 상태 속성이 적합한 값으로 설정되어 있어야 합니다.

Methods to Override

서브클래스가 오버라이드해야 하는 메소드는 Methods for Subclasses에 설명되어 있습니다. 서브클래스는 주기적으로 상태 속성(앞서 설명한)을 주기적으로 재설정해야 하고, ignore(_:for:) 메소드를 호출해야 할 것입니다.

Special Considerations

상태 속성은 UIGestureRecognizer.h에서 읽기전용으로 선언됩니다. 이 속성 선언은 제스쳐 리코그나이저의 클라이언트에 의도된 것입니다. UIGestureRecognizer의 서브클래스는 UIGestureRecognizerSubclass.h를 임포트해야 합니다. 이 헤더 파일은 읽기 및 쓰기를 가능하게 해주는 상태의 재선언을 포함합니다.

0개의 댓글