2011-02-12 8 views
8

UIView를 누르고 드래그하여 손가락으로 따라 가며 볼 수 있습니다. 하지만이 작업을 수행하는 가장 쉬운 방법은 오브젝트 센터를 탭이 발생한 위치 (원하는 것은 아닌)로 설정하여 오브젝트를 움켜 쥐었을 때처럼 오브젝트를 움켜 쥐는 것처럼 움직여야합니다.손가락 아래에서 UIView 드래그

이 작업을 수행하는 데 매우 유용한 방법이 있었으며 iTunes U 비디오 중 하나에서 참조했습니다. 이 스크립트는 deltaX, deltaY를 사용하지 않았지만 이미지를 손가락 아래 중심에 두는 대신 끌어서 놓은 상태에서 이미지를 드래그했지만 그 코드가 무엇인지 기억하지 못합니다.

누구든지이 코드를 참조 할 수 있습니까? 또는 uiview.center = tap.center 개념을 사용하지 않고 UIView를 손가락으로 움직일 수있는 효율적인 방법이 있습니까? 당신은 접촉 지점 (T)와 뷰의 현재 위치를 모두 저장할 수 있습니다

// Tell the "stalker" rectangle to move to each touch-down 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [UIView beginAnimations:@"stalk" context:nil]; 
    [UIView setAnimationDuration:1]; 
    //[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 

    // touches is an NSSet. Take any single UITouch from the set 
    UITouch *touch = [touches anyObject]; 

    // Move the rectangle to the location of the touch 
    stalker.center = [touch locationInView:self]; 
    [UIView commitAnimations]; 
} 
+1

은 대답을합니까 도움? 그렇다면 올바른지 확인하거나 다른 방법으로 답장하십시오 ... – TigerCoding

+0

그는 답장을 보냈습니다 - 그가 찾고있는 것이 아니 었습니다. – xil3

+0

솔루션을 찾았습니까? 나는 당신이 보았다고 주장하는 델타를 사용하지 않은 사람을보고 싶어할지 궁금합니다. – sean

답변

0

(O). touchMoved에서 (O-T)를 추가하여 새 점을 기준으로 이동할 수 있습니다.

+1

코드를 보내 주셔서 감사합니다. 그러나 이것은 내가 성취하려는 것이 아닙니다. UIView의 중심이 손가락을 중심으로 움직이지 않고 손가락을 움직이는 방법에 따라 옮겨 지도록 객체를 손가락으로 움직여야합니다. – Parad0x13

+1

@ Parad0x13 이봐 요, 당신의 prob에 대한 해결책이 있습니까? 그렇다면 나는 똑같은 상황에 직면하고 있으므로 해결해야 할 필요가 있음을 알려주십시오. –

0

난 당신이 스토커의 응용 프로그램에 대해 얘기 생각

+0

그래, 할 수있어. 그러나 그것을 할 수있는 또 다른 깨끗한 방법이 있습니다. UIView 고유의 프레임 워크가있어 직접 수학을 수행하지 않고도 원하는 것을 성취 할 수 있습니다. – Parad0x13

+1

실례합니다. 당신은 확인하거나 확인하고 있습니까? :) 당신이 그러한 프레임 워크를 발견했다면, 지식을 공개하기 위해 여기에 코멘트를 추가하거나 (자신의 질문에 답하십시오)! ;) –

6

여기에 Apple의 MoveMe 프로젝트의 코드가 있습니다. 핵심은 touchesMoved 방법입니다. UIView (PlacardView)은 사용자의 터치가 어디에서든지 터치를보고 이동할 수 있습니다. 희망이 도움이됩니다.

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

UITouch *touch = [touches anyObject]; 

// If the touch was in the placardView, move the placardView to its location 
if ([touch view] == placardView) { 
    CGPoint location = [touch locationInView:self]; 
    placardView.center = location; 
    return; 
    } 
} 
+4

문제는보기에서 시작하지 않고 손가락 이벤트를 이동하면 위치가 변경되어 점프가 발생하는 것입니다. –

+0

이미 올바른 방향을 가리키고 있습니다! 그러나 그것은 내가 그것을 읽을 때 내가 생각했던 것입니다 :) –

9

다음 코드는 패널 /보기 이동을 허용하는 간단한 제스처 인식기의 예입니다. 중심을 수정하는 대신 원점 [기본적으로 대상 뷰의 새 프레임을 설정하여]을 수정합니다. 당신이 gesture.view 드릴 다운 필요하지 않는, 그래서 당신은 당신의 상황에서이 문제를 최적화 할 수 있습니다

... 등

-(void)dragging:(UIPanGestureRecognizer *)gesture 
{ 
    if(gesture.state == UIGestureRecognizerStateBegan) 
    { 
     //NSLog(@"Received a pan gesture"); 
     self.panCoord = [gesture locationInView:gesture.view]; 


    } 
    CGPoint newCoord = [gesture locationInView:gesture.view]; 
    float dX = newCoord.x-panCoord.x; 
    float dY = newCoord.y-panCoord.y; 

gesture.view.frame = CGRectMake(gesture.view.frame.origin.x+dX, gesture.view.frame.origin.y+dY, gesture.view.frame.size.width, gesture.view.frame.size.height); 
} 

스위프트 4 :

@objc func handleTap(_ sender: UIPanGestureRecognizer) { 
     if(sender.state == .began) { 
      self.panCoord = sender.location(in: sender.view) 
     } 

     let newCoord: CGPoint = sender.location(in: sender.view) 

     let dX = newCoord.x - panCoord.x 
     let dY = newCoord.y - panCoord.y 

     sender.view?.frame = CGRect(x: (sender.view?.frame.origin.x)!+dX, y: (sender.view?.frame.origin.y)!+dY, width: (sender.view?.frame.size.width)!, height: (sender.view?.frame.size.height)!) 
    } 
+2

코드에서 "panCoord"는 무엇입니까? –

+0

죄송 합니다만, panCoord는 현재 팬 위치를 추적하는 로컬 CGPoint입니다. 나는 의존성이 거기 있었고 해결되지 않았다는 것을 깨닫지 못했습니다. CGPoint panCoord를 추가하여 "어디에서 이동할지"의 현재 위치를 저장하십시오 –

+0

감사합니다! –

관련 문제