"Trace the movement of fingers around the screen, and apply that movement to your content."
스크린에서 손가락의 움직임을 추적하고, 컨텐트에 해당 움직임을 적용합니다.
팬 제스쳐는 사용자가 하나 혹은 하나 이상의 손가락을 스크린에서 움직일 때 발생합니다. 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
입니다.minimumNumberOfTouches
와 maximumNumberOfTouches
속성 사이에 구체화된 값 사이에 있는지 확인합니다.UIScreenEdgePanGestureRecognizer
객체에서 edges
속성이 설정되어 있는지 확인하고 터치가 적합한 모서리에서 시작하는지 확인합니다.