"Use a gesture recognizer delegate object to determine the order in which gestures are recognized in your views."
뷰에서 인식된 제스쳐들의 순서를 결정하기 위해 제스쳐 리코그나이저 딜리게이트 객체를 사용합니다.
잠재적 충돌의 가능성을 갖는 두 제스쳐 리코그나이저의 경우 오직 한 가지만 연관된 딜리게이트 객체가 필요하며, 해당 객체는 UIGestureRecognizerDelegate
프로토콜을 따르고 있어야 합니다. 딜리게이트에서 적합한 해결을 위해 필요한 메소드를 구현해야 합니다. 이 메소드를 사용하는 최선의 방법에는 몇 가지 예시가 있습니다.
Listing 1은 같은 뷰에서 탭과 더블 탭을 인식하는 방법을 보여줍니다. 이 예제에서 뷰는 두 가지 UITapGestureRecognizer
객체를 갖습니다. 한 가지는 두 번의 탭을 요구합니다. 싱글 탭 제스쳐는 항상 더블 탭 제스쳐 이전에 인식되지만, 이 동작을 반전시키기 위해 gestureRecognizer(_:shouldRequireFailureOf:)
메소드를 사용할 수 있습니다. 이 메소드의 구현은 싱글 탭 제스쳐가 더블 탭 제스쳐 리코그나이저의 실패 상태 도달이 명시적으로 발생할 때까지 인식되는 것을 방지하도록 해줍니다. 이는 터치 연쇄가 오직 하나의 탭만 포함할 때 발생하는 상황을 의미합니다.
Listing 1 Recognizing a single tap only after the failure of a double tap
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
// Don't recognize a single tap until a double-tap fails.
if gestureRecognizer == self.tapGesture &&
otherGestureRecognizer == self.doubleTapGesture {
return true
}
return false
}
Listing 2는 팬 제스쳐 전에 스와이프 제스쳐를 인식하는 방법을 보여줍니다. 이 경우 딜리게이트 객체는 스와이프 제스쳐 리코그나이저에 붙어 있으며, 딜리게이트 객체는gestureRecognizer(_:shouldBeRequiredToFailBy:)
메소드를 구현하고 있습니다. 이 메소드의 로직은 팬 제스쳐가 스와이프 제스쳐의 실패 발생 전까지 인식되는 것을 방지합니다.
Listing 2 Delaying the recognition of a pan gesture until after a swipe fails
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
// Do not begin the pan until the swipe fails.
if gestureRecognizer == self.swipeGesture &&
otherGestureRecognizer == self.panGesture {
return true
}
return false
}
Listing 3은 스와이프와 팬 제스쳐 사이의 의존성을 설정하는 대안 방법입니다. 스와이프 제스쳐에 딜리게이트 객체를 붙이는 것 대신, 이 예시는 팬 제스쳐에 딜리게이트 객체를 붙입니다. 변경사항 때문에 딜리게이트는 gestureRecognizer(_:shouldRequireFailureOf:)
메소드를 구형해야 하고, 스와이프가 실패하길 요구해야 합니다. 최종 결과는 Listing 2와 동일합니다.
Listing 3 An alternative way of requiring a swipe to fail
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if gestureRecognizer == self.panGesture &&
otherGestureRecognizer == self.swipeGesture {
return true
}
return false
}
제스쳐 리코그나이저에 딜리게이트를 붙이는 것은 제스쳐들 사이에서 복잡한 의존성 체인 생성을 가능하게 해줍니다. 제스쳐 인식에 대한 통제는 UIGestureRecognizerDelegate
를 살펴보시기 바랍니다.
UIGestureRecognizerDelegate
https://developer.apple.com/documentation/uikit/uigesturerecognizerdelegate
https://velog.io/@panther222128/UIGestureRecognizerDelegate