Preferring One Gesture Over Another

Panther·2021년 8월 2일
0
post-custom-banner

https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/coordinating_multiple_gesture_recognizers/preferring_one_gesture_over_another

"Use a gesture recognizer delegate object to determine the order in which gestures are recognized in your views."

뷰에서 인식된 제스쳐들의 순서를 결정하기 위해 제스쳐 리코그나이저 딜리게이트 객체를 사용합니다.

Overview

잠재적 충돌의 가능성을 갖는 두 제스쳐 리코그나이저의 경우 오직 한 가지만 연관된 딜리게이트 객체가 필요하며, 해당 객체는 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

post-custom-banner

0개의 댓글