watchOS 11에 Double Tap Gesture API가 추가되었다.
developer.apple.com/document…
SwiftUI API인 handGestureShortcut(_:isEnabled:)을 쓰면 된다.
---
내부적으로 WatchGesturesUI라는 Private Framework로 작동하며, WAGUIPrimaryGestureViewInteraction로 UIKit에서 사용할 수 있다.
github.com/pookjw/Miscellane…
원리를 적자면
- Double Tap을 인식하는 WAGUIGestureInteraction은 view에 _UIExternalTapGestureRecognizer를 추가한다.
- Double Tap이 인식되면 Responder Chain을 통해 Event가 전송되며 _UIExternalTapGestureRecognizer이 수신한다. 이를 통해 App은 Double Tap에 따른 Action을 수행할 수 있다.
만약 App이 Double Tap을 지원하지 않는다면 Carousel은 WAGUIHighlightingEffectHostView를 통해 Guide를 띄우는데 이 원리는
- WAGUIPrimaryGestureInteraction에는 priority라는 개념이 있다. Double Tap이 인식될 때 어떤 Interaction을 수행할지 정할 수 있다. 이는 `-gestureRecognizer:shouldRequireFailureOfGestureRecognizer:`에서 수행한다.
(`-[WAGUIPrimaryGestureInteraction priority]`에서 breakpoint 걸면 해당 작업이 수행되는 과정을 볼 수 있다.)
- UIWindow는 기본적으로 WAGUIPrimaryGestureNegativeInteraction를 가진다. priority (100)가 가장 낮기 때문에, App이 Double Tap을 지원하지 않는다면 이 Interaction이 발동될 것이다.
- WAGUIPrimaryGestureNegativeInteraction이 발동되면 FBS를 통해 Carousel에 WAGUINegativeAction을 전송한다. Carousel은 이 Action이 수신되면 WAGUIHighlightingEffectHostView를 통해 Guide를 보여준다.