About the Gesture Recognizer State Machine

Panther·2021년 7월 31일
0

https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/implementing_a_custom_gesture_recognizer/about_the_gesture_recognizer_state_machine

"Learn about the states and transitions of the state machine that underlies gesture recognizers."

상태 머신의 상태 및 전환에 대해 알아봅니다. 상태 머신은 제스쳐 리코그나이저의 기반입니다.

Overview

제스쳐 리코그나이저는 이벤트를 적합하게 처리할 수 있도록 보장해주는 상태 머신에 의해 작동됩니다. 상태 머신은 UIKit이 사용합니다. 상태 머신은 몇 가지 중요한 동작을 결정합니다.

  • 연속적 제스쳐 리코그나이저가 UIGestureRecognizer.State.began 상태에 진입하도록 허용할지를 결정합니다.
  • 이산적 제스쳐 리코그나이저가 UIGestureRecognizer.State.ended 상태에 진입하도록 하용할지 결정합니다.
  • 액션 핸들러에 대한 호출이 발생하는 시점을 결정합니다.

커스텀 제스쳐 리코그나이저를 구현하려고 한다면, 적절한 시점에 제스쳐 리코그나이저 갖는 상태 머신을 업데이트해야 합니다. 제스쳐 리코그나이저는 항상 UIGestureRecognizer.State.possible에 시작하며, 이 상태는 이벤트 처리를 시작할 준비를 나타내는 상태입니다. 이 상태에서 이산적, 연속적 제스쳐 리코그나이저는 UIGestureRecognizer.State.ended, UIGestureRecognizer.State.failed, UIGestureRecognizer.State.cancelled 상태에 도달하기까지 다른 경로를 따라갑니다. 제스쳐 리코그나이저는 UIKit이 제스쳐 리코그나이저를 재설정하거나 UIGestureRecognizer.State.possible 상태를 반환하는 시점인 현재 이벤트 연속의 마무리가 일어날 때까지 세 가지 상태 중 한 가지로 남게 됩니다.

Managing State Transitions for a Discrete Gesture Recognizer

이산적 제스쳐 리코그나이저를 구현하려면, 상태 속성을 UIGestureRecognizer.State.ended, UIGestureRecognizer.State.failed 두 가지 중 한 가지 상태로 변경시켜야 합니다. Figure 1은 이 전환에 대한 상태 다이어그램을 나타내고 있습니다. 제스쳐에 일치하는 이벤트가 성공적으로 도달하면, 상태를 UIGestureRecognizer.State.ended로 변경시켜야 합니다. 이벤트가 의도한 제스쳐와 일치하지 않는다면, 실패를 감지하자마자 상태를 UIGestureRecognizer.State.failed로 변경시켜야 합니다.

Figure 1 The states of a discrete gesture

제스쳐 리코그나이저가 UIGestureRecognizer.State.ended 상태로 전환하게 되면, UIKit은 모든 연관된 목표 객체의 액션 메소드를 호출합니다. UIKit은 제스쳐 리코그나이저가 UIGestureRecognizer.State.failed 상태로 전환한다고 하더라도 모든 액션 메소드를 호출하지는 않습니다.

이산적 제스쳐 리코그나이저를 구현하는 방법의 예시는 Implementing a. iscrete Guesture Recognizer를 살펴보시기 바랍니다.

Implementing a Discrete Gesture Recognizer
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/implementing_a_custom_gesture_recognizer/implementing_a_discrete_gesture_recognizer

Managing State Transitions for a Continuous Gesture Recognizer

Figure 2는 연속적 제스쳐 리코그나이저에 대한 상태 다이어그램을 나타내고 있습니다. 설정한 상태 전환은 아래 세 가지 일반적인 페이즈로 나눠질 수 있습니다.

  1. 초기 이벤트 연쇄는 제스쳐 리코그나이저를 UIGestureRecognizer.State.began 혹은 UIGestureRecognizer.State.failed 상태로 이동시킵니다.
  2. 후속 이벤트는 제스쳐 리코그나이저를 UIGestureRecognizer.State.changed 혹은 UIGestureRecognizer.State.cancelled 상태로 이동시킵니다.
  3. 마지막 이벤트는 제스쳐 리코그나이저를 UIGestureRecognizer.State.ended 상태로 이동시킵니다.

Figure 2 The states of a continuous gesture

제스쳐 리코그나이저가 UIGestureRecognizer.State.possible 상태일 때, 초기 이벤트 연쇄가 제스쳐와 일치하지 않는다면, 즉시 제스쳐 리코그나이저를 UIGestureRecognizer.State.failed 상태로 이동시켜야 합니다. UIKit은 클라이언트에게 알리기 위해 오직 하나의 제스쳐 리코그나이저만 허용합니다. 커스텀 제스쳐 리코그나이저를 실패 상태로 이딩시키는 것은 다른 제스쳐 리코그나이저가 자신이 갖는 제스쳐를 처리할 수 있는 기회를 마련해줍니다.

만약 초기 이벤트 연쇄가 제스쳐와 일치한다면, 제스쳐 리코그나이저를 UIGestureRecognizer.State.began 상태로 이동시켜야 합니다. 모든 후속 이벤트는 이벤트 정보가 변경되었다는 것을 나타낼 수 있도록 반복적으로 제스쳐 리코그나이저를 UIGestureRecognizer.State.changed 상태로 이동시켜야 합니다. (항상 제스쳐 리코그나이저의 상태 속성을 각각의 새 이벤트에 대해 UIGestureRecognizer.State.changed 상태로 설정해야 합니다. 속성이 이미 해당 값으로 설정되어 있어도 그렇게 해야 합니다. 이 속성을 설정하는 것은 연관된 액션 메소드 호출을 촉발합니다.) 이벤트가 제스쳐의 성공적인 컴플리션을 나타내면, 상태를 UIGestureRecognizer.State.ended로 변경시켜야 합니다. 그러나 이벤트가 제스쳐의 성공적이지 못한 컴플리션을 나타내는 경우, 상태를 UIGestureRecognizer.State.cancelled로 변경시켜야 합니다.

제스쳐 리코그나이저가 UIGestureRecognizer.State.began, UIGestureRecognizer.State.changed, UIGestureRecognizer.State.ended 상태로 전환하게 되면, UIKit은 연관된 모든 목표에 대한 액션 메소드를 호출합니다. UIKit은 제스쳐 리코그나이저가 다른 상태로 전환될 때에는 액션 메소드를 호출하지 않습니다.

연속적 제스쳐 리코그나이저를 구현하는 방법에 대한 예시는 Implementing a Continuous Gesture Recognizer를 살펴보시기 바랍니다.

Handling Cancellation

제스쳐의 취소는 현재 이벤트 연쇄가 전화 수신과 같은 시스템 이벤트로 인해 방해받았을 경우 자동으로 발생합니다. 코드 작성으로 이벤트 정보나 조건에 기반해 제스쳐를 취소할 수도 있습니다. 취소는 제스쳐 리코그나이저가 사용자의 의도하지 않은 작업을 수행하는 것을 방지합니다.

시스템이 제스쳐를 취소시키면, UIKit은 제스쳐 리코그나이저의 tochesCancelled(:with) 혹은 pressesCancelled(:with:) 메소드를 호출합니다. 이와 같은 일이 발생하면 제스쳐 리코그나이저를 즉시 UIGestureRecognizer.State.cancelled 상태로 이동시켜야 합니다. 제스쳐 리코그나이저를 UIGestureRecognizer.State.cancelled state 상태로 이동시키면, UIKit은 결과를 초래하기 전에 마지막으로 제스쳐 리코그나이저의 액션 메소드를 호출합니다.

Resetting the Gesture Recognizer State Machine

제스쳐 리코그나이저의 초기 설정을 되돌리기 위해 reset() 메소드를 구현하고 사용하시기 바랍니다. 예를 들어 제스쳐 리코그나이저의 커스텀 속성을 시작값으로 되돌리기 위해 이 메소드르 사용합니다. 새 이벤트 연쇄를 전달하기 전에 UIKit은 터치를 받았거나 상태가 UIGestureRecognizer.State.failed, UIGestureRecognizer.State.cancelled, UIGestureRecognizer.State.ended인 모든 제스쳐 리코그나이저의 reset() 메소드를 호출합니다. reset() 메소드를 호출하는 것과 더불어 UIKit은 제스쳐 리코그나이저가 새 이벤트 연쇄에 반응할 수 있도록 자동으로 제스쳐 리코그나이저의 상태 속성을 UIGestureRecognizer.State.possible 상태로 되돌립니다.

0개의 댓글