공식문서 링크 : Apple Developer Documentation
Protocol
UIGestureRecognizerDelegate
A set of methods implemented by the delegate of a gesture recognizer to fine-tune an app’s gesture-recognition behavior.
-> 앱의 제스처 동작을 미세조정하기 위해서 구현된 메소드 집합입니다.
@MainActor protocol UIGestureRecognizerDelegate
역시 제스쳐니까 @MainActor로 되어 있네요. (짧게 설명하면, 메인스레드에서 동작)
이 델리게이트를 통해서 여러 제스쳐들을 관리 및 통제를 할 수 있다고 합니다. 예를들면, 하나가 동작하는 동안 다른 제스처는 동작을 안하게 한다던가, 특정 제스처가 동작할 때 이곳에 있는 메소드를 재정의해서 특정 로직을 처리하게 할 수도 있겠죠.
공식문서에서 제공한 예시는, 스크린의 모서리를 클릭했을 때, 발생할 수 있는 원하시 않는 상황들을 제어할 수 있는 코드를 제공하고 있습니다.
개인적으로 제공된 사례와 같은 경우가 없어서 크게 공감은 못했네요.
let myScreenEdgePanGestureRecognizer = UIScreenEdgePanGestureRecognizer(target: self, action:#selector(handleScreenEdgePan))
myScreenEdgePanGestureRecognizer.delegate = self
// Configure the gesture recognizer and attach it to the view.
...
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
guard let myView = myScreenEdgePanGestureRecognizer.view,
let otherView = otherGestureRecognizer.view else { return false }
return gestureRecognizer == myScreenEdgePanGestureRecognizer &&
otherView.isDescendant(of: myView)}
위 예시에서 핵심은 메소드입니다.
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer)
-> Bool
파라미터로 제스처를 받고 있고, 또 그 외에 제스처를 파라미터로 받고 있습니다.
그래서 그 둘을 구분하는 거죠. 그를 통해서 원하는 로직을 구현할 수 있습니다.
제 예시를 들자면, Drawing(그리기기능)을 구현하고 있는데, Zoom 기능이 필요했습니다.
Zoom의 경우 -> PinchGesture(생소하시다면 제글참조…^_^)
Drawing의 경우 -> PanGesture
이렇게 두 개가 다른 제스쳐로 동작하지만 하나의 화면에서 제스쳐에 따라서 하나는 줌기능을 하나는 드로잉기능을 담당해야 했습니다. 이럴 때, 사용하면 좋다고 생각해서 적용했었네요.
이 메소드는 default 로 하나의 제스처를 인식하면 다른것을 차단합니다. 동시에 인식시키고 싶다면 true를 리턴하면 되겠습니다.
위 상황이라면, 한 번쯤이 내용을 확인해보세요^_^