"Learn about the states and transitions of the state machine that underlies gesture recognizers."
상태 머신의 상태 및 전환에 대해 알아봅니다. 상태 머신은 제스쳐 리코그나이저의 기반입니다.
제스쳐 리코그나이저는 이벤트를 적합하게 처리할 수 있도록 보장해주는 상태 머신에 의해 작동됩니다. 상태 머신은 UIKit
이 사용합니다. 상태 머신은 몇 가지 중요한 동작을 결정합니다.
UIGestureRecognizer.State.began
상태에 진입하도록 허용할지를 결정합니다.UIGestureRecognizer.State.ended
상태에 진입하도록 하용할지 결정합니다.커스텀 제스쳐 리코그나이저를 구현하려고 한다면, 적절한 시점에 제스쳐 리코그나이저 갖는 상태 머신을 업데이트해야 합니다. 제스쳐 리코그나이저는 항상 UIGestureRecognizer.State.possible
에 시작하며, 이 상태는 이벤트 처리를 시작할 준비를 나타내는 상태입니다. 이 상태에서 이산적, 연속적 제스쳐 리코그나이저는 UIGestureRecognizer.State.ended
, UIGestureRecognizer.State.failed
, UIGestureRecognizer.State.cancelled
상태에 도달하기까지 다른 경로를 따라갑니다. 제스쳐 리코그나이저는 UIKit
이 제스쳐 리코그나이저를 재설정하거나 UIGestureRecognizer.State.possible
상태를 반환하는 시점인 현재 이벤트 연속의 마무리가 일어날 때까지 세 가지 상태 중 한 가지로 남게 됩니다.
이산적 제스쳐 리코그나이저를 구현하려면, 상태 속성을 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
Figure 2는 연속적 제스쳐 리코그나이저에 대한 상태 다이어그램을 나타내고 있습니다. 설정한 상태 전환은 아래 세 가지 일반적인 페이즈로 나눠질 수 있습니다.
UIGestureRecognizer.State.began
혹은 UIGestureRecognizer.State.failed
상태로 이동시킵니다.UIGestureRecognizer.State.changed
혹은 UIGestureRecognizer.State.cancelled
상태로 이동시킵니다.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를 살펴보시기 바랍니다.
제스쳐의 취소는 현재 이벤트 연쇄가 전화 수신과 같은 시스템 이벤트로 인해 방해받았을 경우 자동으로 발생합니다. 코드 작성으로 이벤트 정보나 조건에 기반해 제스쳐를 취소할 수도 있습니다. 취소는 제스쳐 리코그나이저가 사용자의 의도하지 않은 작업을 수행하는 것을 방지합니다.
시스템이 제스쳐를 취소시키면, UIKit
은 제스쳐 리코그나이저의 tochesCancelled(:with)
혹은 pressesCancelled(
:with:)
메소드를 호출합니다. 이와 같은 일이 발생하면 제스쳐 리코그나이저를 즉시 UIGestureRecognizer.State.cancelled
상태로 이동시켜야 합니다. 제스쳐 리코그나이저를 UIGestureRecognizer.State.cancelled state
상태로 이동시키면, UIKit
은 결과를 초래하기 전에 마지막으로 제스쳐 리코그나이저의 액션 메소드를 호출합니다.
제스쳐 리코그나이저의 초기 설정을 되돌리기 위해 reset()
메소드를 구현하고 사용하시기 바랍니다. 예를 들어 제스쳐 리코그나이저의 커스텀 속성을 시작값으로 되돌리기 위해 이 메소드르 사용합니다. 새 이벤트 연쇄를 전달하기 전에 UIKit
은 터치를 받았거나 상태가 UIGestureRecognizer.State.failed
, UIGestureRecognizer.State.cancelled
, UIGestureRecognizer.State.ended
인 모든 제스쳐 리코그나이저의 reset()
메소드를 호출합니다. reset()
메소드를 호출하는 것과 더불어 UIKit
은 제스쳐 리코그나이저가 새 이벤트 연쇄에 반응할 수 있도록 자동으로 제스쳐 리코그나이저의 상태 속성을 UIGestureRecognizer.State.possible
상태로 되돌립니다.