[UIKit][UIGesture] UIGestureRecognizerDelegate 에 대하여

Uno·2021년 10월 5일
0

UIKit

목록 보기
5/9

공식문서 링크 : Apple Developer Documentation

UIGestureRecognizerDelegate 에 대하여

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)}

프로토콜 메소드 “gestureRecognizer”

위 예시에서 핵심은 메소드입니다.

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
 shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) 
-> Bool

파라미터로 제스처를 받고 있고, 또 그 외에 제스처를 파라미터로 받고 있습니다.

그래서 그 둘을 구분하는 거죠. 그를 통해서 원하는 로직을 구현할 수 있습니다.

제 예시를 들자면, Drawing(그리기기능)을 구현하고 있는데, Zoom 기능이 필요했습니다.

Zoom의 경우 -> PinchGesture(생소하시다면 제글참조…^_^)
Drawing의 경우 -> PanGesture

이렇게 두 개가 다른 제스쳐로 동작하지만 하나의 화면에서 제스쳐에 따라서 하나는 줌기능을 하나는 드로잉기능을 담당해야 했습니다. 이럴 때, 사용하면 좋다고 생각해서 적용했었네요.

이 메소드는 default 로 하나의 제스처를 인식하면 다른것을 차단합니다. 동시에 인식시키고 싶다면 true를 리턴하면 되겠습니다.

정리

  • 하나의 UIView 서브클래스에서 다양한 제스쳐가 있다.
  • 나는 그 제스처를 관리하고 싶다.
  • 위 프로토콜을 채택하여 구현한다.

위 상황이라면, 한 번쯤이 내용을 확인해보세요^_^


참고자료

profile
iOS & Flutter

0개의 댓글