0

나는 사진을 꼬집고 동시에 이동할 수있는 사진 앱과 유사한 상호 작용을 재현하려고합니다. 터치 팬을 추가하거나 제거하면 팬이 완벽하게 작동합니다.핀치 및 팬 제스처 인식기를 동시에 처리 할 때 터치 위치를 어떻게 변경합니까?

내 코드에서 터치의 위치를 ​​사용하여보기를 이동합니다. 두 손가락으로 드래그하면 팬 제스처 인식기가 두 손가락 사이에 포인트를 놓습니다.하지만 손가락을 올리면 포인트가 한 손가락의 포인트로 변경되어보기가 새 위치로 급히 움직입니다. .

최대 NumberOfTouches를 1로 설정해도 손가락 1, 팬, 손가락 2, 팬, 리프트 핑거 1로 터치 할 수 있고 손가락 2의 위치로 움직일 수 있기 때문에 문제가 해결되지 않습니다. 이미지를 확대/축소하고 회전 할 수 있기 때문에 두 손가락으로 패닝 할 수 있습니다.

다른 이유로 UIScrollView를 사용할 수 없지만 그 문제가 없다는 것을 알고 있습니다.

제가 생각할 수있는 유일한 해결책은 손가락을 추가하거나 제거 할 때마다 초기 터치 위치를 얻고 이전 위치를 기준으로 새 위치를 오프셋하는 것입니다. 하지만 그 정보를 얻는 방법을 모르겠습니다.

API가 있습니까? 위의 방법이 유일한 방법입니까, 그렇다면 어떻게해야합니까?

+0

UIGestureRecognizer'위치 (in :)'는 중심입니다. 그것은 터치의 위치가 아닙니다. 터치 위치는'location (ofTouch : in :)'또는 UITouch'location (in :)'입니다. – matt

+0

알아. 하지만 기본적으로 내가 원하는대로 기본값입니다. 아래에 해결책을 게시했습니다. 당신이 뭔가 더 잘 알고 있다면 나는 알고 싶습니다. – EdwardSanchez

+0

문제는 팬 제스처에 응답하여보기를 드래그 가능하게 만드는 올바른 방법은'location (in :)'을 사용하는 것이 아니라는 것입니다. 그런 식으로하면 인생을 불필요하게 복잡하게 만듭니다. – matt

답변

0

좋아, 그럼 내가 어떻게 해결했는지.

제스처 기능 내에서 전역 변수에 터치 위치가 지정되었습니다. 상태에서는

self.touchInView.x = sender.location(in: superview).x - frame.origin.xself.touchInParent = sender.location(in: superview) self.touchInView.y = sender.location(in: superview).y - frame.origin.y

== 내가 터치의 위치를 ​​설정 OriginalTouch라는 변수가 .began.

if gesture.state == .began { 
originalTouch = self.touchInView 
} 

그러면 상태 == I는 접촉의 수를 변경하는 경우를 감지하고 계산 .changed 오프셋 :

//Reset original touch position if number of touch changes so view remains in the same position 
if sender.numberOfTouches != lastNumberOfTouches { 
    originalTouch.x += (touchInView.x - originalTouch.x) 
    originalTouch.y += (touchInView.y - originalTouch.y) 
} 

lastNumberOfTouches = sender.numberOfTouches 

는 이제

self.frame.origin = touchInParent - originalTouch 
originalTouch에 기초하여 볼의 위치를 ​​설정할 수
1

내가 이해하는 것처럼 제스처 인식기의(영문)에서 사용자가 반 드래그하여 손가락 수를 변경하면 팬 (끌기)에 응답하는 코드가 작동하지 않습니다.점프.

문제는 코드의 기본 가정이 모두 잘못되었습니다. 보기를 드래그 할 수있게하려면 이 아니고이 아닌 location(in:)을 확인하십시오. translation(in:)을 확인하십시오. 그것이 바로 그 때문입니다. 사용자가 여러 손가락으로 시작하고 드래그하는 동안 일부 리프트하더라도 잘 작동

@objc func dragging(_ p : UIPanGestureRecognizer) { 
    let v = p.view! 
    switch p.state { 
    case .began, .changed: 
     let delta = p.translation(in:v.superview) 
     var c = v.center 
     c.x += delta.x; c.y += delta.y 
     v.center = c 
     p.setTranslation(.zero, in: v.superview) 
    default: break 
    } 
} 

:

이 팬 제스처 인식기와 드래그 뷰를 만들기위한 표준 패턴입니다.