2013-07-22 2 views
0

사용자가 오른쪽으로 드래그 할 수있는 이미지가 있으며 사용자가 이미지를 놓으면 다시 튀어 나옵니다. 사용자가 신속하게 드래그하여 놓을 때 일부 코드를 실행하고 싶습니다. 이제는 사용자가 이미지를 드래그 한 다음 임의의 시간 (예 : 5 초) 동안 이미지를 드래그 한 다음 빠르게 드래그하여 놓을 수 있다는 매우 까다로운 요구 사항이 있습니다. 이미지가 릴리스 될 때 특정 속도 이상으로 움직이는 동안 코드가 실행됩니다. 최소 속도보다 낮 으면 다른 코드를 실행합니다. 그래서 제스처 시작과 끝 사이의 시간 길이를 계산할 수 없으며 시간 길이에 따라 코드를 실행할 수 없습니다. 내가 무엇을 할 수 있을지? 나는 어떻게 든 제스처가 끝나기 전에 이미지가 움직이는 속도를 마지막으로 500 밀리 초를 알아야한다고 생각합니다. 그러나 나는 벽돌 벽을 치는 방법을 알아 냈다. 어떤 도움이라도 대단히 감사하겠습니다.사용자가 이미지를 드래그하는 속도를 어떻게 계산합니까?

대답에 대한 설명과 가능한 예제 코드를 포함하면 큰 도움이 될 수 있습니까?

+2

'UIPanGestureRecognizer'의'velocityInView' 메소드를 살펴 보자. – bobnoble

+0

일부 코드를 게시 할 수 있습니까? @ bobnoble이 언급했듯이, 제스처 인식기를 사용하는 경우 속도를 얻는 것이 쉽지 않습니다. – Can

+0

UIPanGestureRecognizer를 사용하고 있습니다. 내 컴퓨터에 접속하면 오늘 코드를 게시 할 예정입니다. 왜 UIPanGestureRecognizer로 속도를 얻을 필요가 없습니까? –

답변

0

인터넷에서 좀 더 검색 한 결과 마침내 내 자신의 질문에 대답했습니다.

내 UIPanGestureRecognizer :

CGPoint vel = [recognizer velocityInView:self.myView]; 

다음 :

- (IBAction)handlePan3:(UIPanGestureRecognizer *)recognizer3 

가 화면을 가로 질러 이동 사용자의 손가락의 속도를 얻기

은 내가 할 필요가 무엇인지 일

if (vel.x > /*value*/) { 
// Your code 
} 

나는 이제 막 포기했습니다. 나는 결국 거기에 도착했다. 모든 도움을 주셔서 감사합니다. 나는 도움이 되었기 때문에 하나 또는 두 개의 대답을 upvoted했습니다. bobnoble은 실제로 velocityInView를 사용하라는 제안을했고, 필자는 내가 필요로하는 정보를 준 다른 스택 오버 플로우 질문을 발견했다 : iOS - Making sense of velocityInView on UIPanGesture

1

이미지를 드래그 할 때의 시작 X 좌표와 마우스를 놓을 때의 X 좌표를 얻을 수 있다면 pythagoras 'theorm을 사용하여 두 점 사이의 거리를 계산할 수 있습니다 : http://en.wikipedia.org/wiki/Pythagorean_theorem

또한 mouseup 이벤트에서 마우스를 움직여 마우스를 움직이면 타이머를 시작하고 mouseup 이벤트에서 타이머를 시작하면 시간과 거리를 사용하여 속도를 계산할 수 있습니다 (속도 = 거리/시간)

다음 편집 코멘트 :

point delayedMousePos; 
point previousMousePos; 

bool secondDrag = false; 
bool isStopped = false; 

var timeFirstStopped; 
var positionCount = 0; 

array previousMousePositions[3]; 

// timer which monitors mouse position (set to an interval of say, 10ms) 
function timerMonitorMousePos_Elapsed() { 
    point currentMousePos = getMousePos(); 

    if (isStopped == false) { 
     if (positionCount >= 2) { 
      array_shift(previousMousePositions); // remove the first element of the array and move everything down to reindex numerical array to start counting from zero 
      positionCount = 2; // keep positionCount within array bounds 
     } 

     previousMousePositions[positionCount] = currentMousePos; // add the new position to the end of the 'stack' 
     positionCount++; 
    } 

    if (currentMousePos == previousMousePos) { // start check for stationary 
     isStopped = true; 
     if (timeFirstStopped == null) { 
      timeFirstStopped = NOW(); 
     } else { 
      if (NOW() - timeFirstStopped >= 500) { // we have been stopped for at least 500ms (assumes time is counted in milliseconds) 
       secondDrag = true; 
       // previousMousePositions[0] = the mouse position 30ms before the mouse stopped 
      } 
     } 
    } else { 
     isStopped = false; 
     timeFirstStopped = null; 
    } 

    previousMousePos = currentMousePos; 
} 
+0

답장을 보내 주셔서 감사합니다.내 질문에 언급했듯이 어색한 상황은 사용자가 끌어서 반쯤 멈추고 이미지를 빠르게 이동하고 코드를 릴리스하고 계속 활성화 할 수 있어야하기 때문에 내가 할 수 없다는 것을 의미합니다. 사용자가 이미지를 발표하기 전에 최종 속도를 실제로 계산해야합니다. 그 말이 맞는다면. 릴리스 전의 움직임의 마지막 밀리 초에서 시작부터 끝까지의 속도를 계산해서는 안됩니다. –

+0

다른 타이머를 사용하여 마우스 위치를 모니터링하여 드래그하면서 움직이지 않았는지 확인한 다음 부울 스위치를 사용하여 mousemove 이벤트가 다음에 움직일 때 '두 번째 끌기'라는 것을 알 수 있습니다. 이 타이머를 사용하여 다른 마우스 좌표를 선택하여 거리/속도를 계산할 수도 있습니다. – Alfie

+0

내가 필요로 할 때 그것이 효과가 있다고 나는 생각하지 않는다. 내가 틀렸다고 정정 해 주지만, 사용자가 이미지를 아주 천천히 드래그하여 약 10 초가 지나면 빠르게 움직여서 멈추지 않고 그대로 놓아 둘 수는 없다고 생각합니다. –

0

나는 타이머를 사용하지 않을 것이다. 드래그가 시작되면 x, y 위치와 함께 시작 날짜/시간을 저장합니다.

끌기가 끝나면 끝나는 날짜/시간과 위치를 저장하십시오. 이 정보를 통해 거리를 밀리 초 단위로 계산할 수 있습니다.

+0

나는 그것이 필요한만큼 잘 동작 할 것이라고 생각하지 않는다. 왜냐하면 사용자가 이미지를 움직일 수 없기 때문이다. 천천히 시작하고 릴리스하기 직전에 빨리 움직여 놓으십시오. 내가 할 수 있어야 할 필요가있는 것은 지난 500 밀리 초 동안 이미지의 속도를 계산하는 것이고 그 속도는 코드가 실행되는지 여부를 결정하는 것이라고 생각합니다. –

관련 문제