NSGestureRecognizer

Panther·2021년 8월 8일
0
post-custom-banner

https://developer.apple.com/documentation/appkit/nsgesturerecognizer

"An object that monitors events and calls its action method when a predefined sequence of events occur."

사전에 정의된 이벤트 연속이 발생할 때 이벤트를 모니터링 하고 액션 메소드를 호출하는 객체입니다.

Declaration

@MainActor class NSGestureRecognizer : NSObject

Overview

제스쳐 리코그나이저는 한 번의 클릭, 클릭과 드래그, 혹은 회전을 암시하는 이벤트의 연속을 인식할 것입니다. 이 클래스의 인스턴스를 직접 생성하지 않아야 합니다. 이 클래스는 모든 제스쳐 리코그나이저를 위한 일반적인 동작을 정의하는 추상 베이스 클래스입니다. 앱에서 제스쳐 리코그나이저를 사용할 때, 구체화된 서브클래스의 하나에 대한 인스턴스를 생성하시기 바랍니다.

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

  • NSClickGestureRecognizer
  • NSMagnificationGestureRecognizer
  • NSPanGestureRecognizer
  • NSPressGestureRecognizer
  • NSRotationGestureRecognizer

NSClickGestureRecognizer

https://developer.apple.com/documentation/appkit/nsclickgesturerecognizer
https://velog.io/@panther222128/NSClickGestureRecognizer

NSMagnificationGestureRecognizer

https://developer.apple.com/documentation/appkit/nsmagnificationgesturerecognizer
https://velog.io/@panther222128/NSMagnificationGestureRecognizer

NSPanGestureRecognizer

https://developer.apple.com/documentation/appkit/nspangesturerecognizer
https://velog.io/@panther222128/NSPanGestureRecognizer

NSPressGestureRecognizer

https://developer.apple.com/documentation/appkit/nspressgesturerecognizer
https://velog.io/@panther222128/NSPressGestureRecognizer

NSRotationGestureRecognizer

https://developer.apple.com/documentation/appkit/nsrotationgesturerecognizer
https://velog.io/@panther222128/NSRotationGestureRecognizer

제스쳐 리코그나이저는 특정 뷰(혹은 해당 뷰의 하위뷰에서) 이벤트에 대해 작동합니다. 제스쳐 리코그나이저 생성 후 addGestureRecognizer(_:) 메소드를 사용해 하나의 뷰에 제스쳐 리코그나이저를 붙이시기 바랍니다. 앱으로부터 받은 이벤트는 상응하는 뷰에 전달되기 전에 모든 관련 제스쳐 리코그나이저에 자동으로 전달됩니다. 제스쳐 리코그나이저는 인식이 완료되거나 이벤트가 정상적으로 전달되기까지 이벤트의 진행을 지연시킬 수 있습니다.

제스쳐 리코그나이저는 이산적 혹은 연속적인 제스쳐를 감지할 수 있습니다. 클릭 제스쳐는 이산적입니다. 왜냐하면 마우스 다운 및 마우스 업 이벤트에 관여하고 있으며, 둘 사이에 움직임을 갖지 않기 때문입니다. 반대로 팬 혹은 회전 제스쳐는 연속적입니다. 왜냐하면 시간이 걸쳐 마우스 움직임을 추적하는 데 관여하기 때문입니다.

제스쳐 인식 과정 동안 제스쳐 리코그나이저는 관련 타깃 객체의 액션 메소드를 호출해서 인식 프로세스의 상태를 알려줍니다. 이산적 제스쳐의 경우 액션 메소드는 제스쳐가 인식될 때 한 번만 호출됩니다. 연속적 제스쳐의 경우 제스쳐 리코그나이저의 현재 상태에 따라 여러번 호출됩니다. 이 상황에서 마우스 관련 애니메이션 생성과 같은 적합한 작업 수행을 위해 액션 메소드를 사용할 수 있으며, 제스쳐 리코그나이저 프로세스의 마지막 결과 역시 처리할 수 있습니다.

제스쳐 리코그나이저는 하나의 액션 메소드와 하나의 타깃 객체만을 갖습니다. 그리고 메소드는 아래 시그니처 중 하나를 따르고 있어야 합니다.

func handleGesture() { }
func handleGesture(gestureRecognizer: NSGestureRecognizer) { }

코드에서 제스쳐의 특정한 부분에 대해 추가적인 정보가 필요하다면, 제스쳐 리코그나이저 파라미터를 포함하는 액션 메소드를 정의하시기 바랍니다. 연속적 제스쳐를 처리하는 경우 대부분 항상 제스쳐 리코그나이저가 필요할 것입니다. 예를 들어 회전 제스쳐의 경우 업데이트된 회전 값을 가져오기 위해 제스쳐 리코그나이저 객체를 사용하게 될 것입니다. 제스쳐가 발생한 위치를 가져오기 위해 제스쳐 리코그나이저 객체를 사용할 수도 있습니다.

State Transitions

제스쳐 리코그나이저는 사전에 정의된 상태 머신 내부에서 작동하며, 이벤트를 처리할 때 상태에 상태로 전환합니다. 모든 제스쳐 리코그나이저는 Possible (NSGestureRecognizer.State.possible)에서 시작하지만, 가능한 전환은 연속적 제스쳐와 이산적 제스쳐가 다릅니다.

이산적 제스쳐는 Possible 상태에서 곧바로 Recognized (recognized) 혹은 Failed (NSGestureRecognizer.State.failed) 상태로 전환되며, 이는 제스쳐를 성공적으로 해석하는지 여부에 따라 달라집니다. 만약 이산적 제스쳐 리코그나이저가 Recognized 상태로 전환하면, 타깃 객체의 액션 메소드를 호출합니다.

연속적 제스쳐의 경우 상태 전환은 아래와 같습니다.

Possible —> Began —> [Changed] —> Cancelled
Possible —> Began —> [Changed] —> Ended

Changed 상태는 옵셔널이고, Cancelled 혹은 Ended 상태에 도달되기 전에 여러번 발생합니다. 많은 상태 전환이 제스쳐 리코그나이저가 액션 메소드를 호출하도록 합니다. 이벤트를 모니터링하는 동안 상태 속성을 NSGestureRecognizer.State.changed로 설정하는 것 역시 액션 메소드를 호출합니다. 앱의 상태를 업데이트하거나 커스텀 애니메이션 업데이트를 위해 이 호출을 사용할 수 있습니다.

가능한 상태의 리스트는 NSGestureRecognizer.State에 있는 상수를 살펴보시기 바랍니다.

NSGestureRecognizer.State
https://developer.apple.com/documentation/appkit/nsgesturerecognizer/state

Subclassing Notes

구분되는 제스쳐를 인식하기 위해 NSGestureRecognizer의 서브클래스를 생성하게 될 것이며, 예를 들어 "체크 마크" 제스쳐가 있습니다. 커스텀 제스쳐 리코그나이저는 모든 적합한 이벤트 관련 메소드를 구현해, 상태 정보 관리를 위한 몇 가지 다른 메소드와 함께 제스쳐를 감지할 것입니다.

모든 제스쳐 리코그나이저는 적합한 시점에 상태 속성에서 값을 업데이트해야 합니다. 구체적으로 모든 상태 전환과 관련해 업데이트해야 합니다. 제스쳐 리코그나이저의 상태 전환에 대한 더 많은 정보는 State Transitions를 살펴보시기 바랍니다.

State Transitions는 이 글의 윗부분에 나와있습니다.

Methods to Override

고유한 제스쳐 리코그나이저 서브클래스를 생성하는 경우 아래처럼 진행합니다.

  • reset() 메소드를 구현하고 Methods for Subclasses에 있는 관련 메소드를 구현합니다.
  • 제스쳐에 대한 적합한 지점을 구체화할 필요가 있을 때 location(in:) 메소드를 오버라이드합니다.

Methods for Subclasses의 링크는 이 글로 연결됩니다.

AppKit은 제스쳐 인식 프로레스 시작 전, 마우스 다운 이벤트, 확대 이벤트, 혹은 회전 이벤트가 발생하기를 기다립니다. 제스쳐를 인식하기 위해 오직 키 다운 이벤트만 사용되는 제스쳐 리코그나이저는 마우스 다운, 확대, 회전 이벤트가 인식 프로세스를 시작하기까지, 호출되는 keyDown(with:) 메소드를 갖지 않을 것입니다.

Alternatives to Subclassing

NSGestureRecognizer 클래스는 모든 구체화된 제스쳐 리코그나이저를 위해 설정될 수 있는 일반적인 동작을 정의합니다. 또한, 서브클래싱 없이 몇 가지 동작의 finer-grained 커스터마이징을 위한 딜리게이트(NSGestureRecognizerDelegate 프로토콜을 채택하는 객체)를 지원합니다. 예를 들어 특정 제스쳐 리코그나이저 객체 사이에 의존성을 생성하도록 딜리게이트를 사용할 수 있습니다.

제스쳐 리코그나이저의 동작을 제어하기 위한 딜리게이트 사용의더 많은 정보는 NSGestureRecognizerDelegate를 살펴보시기 바랍니다.

NSGestureRecognizerDelegate
https://developer.apple.com/documentation/appkit/nsgesturerecognizerdelegate

See Also


Custom Gestures

NSGestureRecognizerDelegate

<>
<>


post-custom-banner

0개의 댓글