Handling Pan Gestures

Panther·2021년 7월 30일
0
post-custom-banner

https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_uikit_gestures/handling_pan_gestures

"Trace the movement of fingers around the screen, and apply that movement to your content."

스크린에서 손가락의 움직임을 추적하고, 컨텐트에 해당 움직임을 적용합니다.

Overview

팬 제스쳐는 사용자가 하나 혹은 하나 이상의 손가락을 스크린에서 움직일 때 발생합니다. screen-edge 팬 제스쳐는 스크린의 모서리로부터 시작하는 특수 팬 제스쳐입니다. 팬 제스쳐에 대해 UIPanGestureRecognizer 클래스를 사용하고, screen-edge 팬 제스쳐에 대해 UIScreenEdgePanGestureRecognizer 클래스를 사용하시기 바랍니다.

아래 방법으로 제스쳐 리코그나이저를 구현할 수 있습니다.

  • 코드 작성 방법입니다.뷰의 addGestureRecognizer(_:) 메소드를 호출합니다.
  • 인터페이스 빌더에서 구현하는 방법입니다. 라이브러리로부터 적합한 객체를 드래그하고 뷰에 드롭합니다.

사용자가 스크린에서 손가락을 움직이는 제스쳐를 추적할 필요가 있는 작업에 대해서 팬 제스쳐 리코그나이저를 사용하시기 바랍니다. 인터페이스에서 객체를 드래그하는 데 팬 제스쳐 리코그나이저를 사용하거나 사용자의 손가락 위치에 기반해 객체를 업데이트하기 위해 팬 제스쳐 리코그나이저를 사용할 수 있습니다. 팬 제스쳐는 연속적입니다. 그렇기 때문에 컨텐트를 업데이트할 여지를 남기면서 터치 정보가 변경될 때마다 액션 메소드가 호출됩니다.

요구되는 최소한의 초기 움직임이 충족되는 즉시 팬 제스쳐 리코그나이저는 UIGestureRecognizer.State.began 상태에 진입합니다. 처음 변경이 생기면 후속 변경은 제스쳐 리코그나이저가 UIGestureRecognizer.State.changed 상태에 진입하도록 합니다. 사용자의 손가락이 스크린으로부터 벗어나게 될 때, 제스쳐 리코그나이저는 UIGestureRecognizer.State.ended 상태에 진입합니다.

추적을 단순화하려면, 사용자의 손가락이 시작된 위치로부터의 거리를 가져오기 위해 팬 제스쳐 리코그나이저의 translation(in:) 메소드를 사용할 수 있습니다. 제스쳐의 시작 시점에 팬 제스쳐 리코그나이저는 사용자의 손가락 접촉 시작점을 저장합니다. (만약 제스쳐가 여러 손가락으로 시작된다면, 제스쳐 리코그나이저는 터치 집합의 중심점을 사용합니다.) 손가락이 움직이는 시점마다 translation(in:) 메소드는 시작 위치로부터의 거리를 알려줍니다.

Listing 1은 스크린에서 뷰를 드래그하기 위해 사용되는 액션 메소드를 나타내고 있습니다. 제스쳐가 시작될 때, 이 메소드는 뷰의 초기 위치를 저장합니다. 이후 사용자 손가락의 움직임에 기반해 뷰의 위치를 업데이트합니다.

Listing 1 Dragging a view around the screen

var initialCenter = CGPoint()  // The initial center point of the view.
@IBAction func panPiece(_ gestureRecognizer : UIPanGestureRecognizer) {   
   guard gestureRecognizer.view != nil else {return}
   let piece = gestureRecognizer.view!
   // Get the changes in the X and Y directions relative to
   // the superview's coordinate space.
   let translation = gestureRecognizer.translation(in: piece.superview)
   if gestureRecognizer.state == .began {
      // Save the view's original position. 
      self.initialCenter = piece.center
   }
      // Update the position for the .began, .changed, and .ended states
   if gestureRecognizer.state != .cancelled {
      // Add the X and Y translation to the view's original position.
      let newCenter = CGPoint(x: initialCenter.x + translation.x, y: initialCenter.y + translation.y)
      piece.center = newCenter
   }
   else {
      // On cancellation, return the piece to its original location.
      piece.center = initialCenter
   }
}

만약 팬 제스쳐 리코그나이저를 위한 코드가 호출되지 않는다면, 아래 조건이 true인지 확인하고 수정이 필요한 경우 수정하시기 바랍니다.

  • 뷰의 isUserInteractionEnabled 속성이 true인지 확인합니다. 이미지 뷰와 레이블은 이 속성이 기본값으로 false입니다.
  • 터치의 수가 minimumNumberOfTouchesmaximumNumberOfTouches 속성 사이에 구체화된 값 사이에 있는지 확인합니다.
  • UIScreenEdgePanGestureRecognizer 객체에서 edges 속성이 설정되어 있는지 확인하고 터치가 적합한 모서리에서 시작하는지 확인합니다.
post-custom-banner

0개의 댓글