2012-01-19 2 views
1

나는 분필을 나타내는 UIImageView 있습니다. 사용자는이를 위로 집어 화면 위로 드래그하여 그릴 수 있습니다.원활하게 UI에서 사용자의 손가락으로 이동 내 응용 프로그램에서

touchesBegan, touchesMoved 및 touchesEnded를 사용하여 구현했습니다. touchesMoved에서 UIImageView의 중심을 현재 터치 위치로 이동하고 마지막 그래픽에서 현재 그래픽까지의 선을 그립니다.

이 방법은 정상적으로 작동하지만 이미지보기의 움직임이 부드럽지 않고 터치가 뒤처집니다. 이미 UIPanGestureRecognizer (제스처를 인식하지 못함)와 UIScrollView (실제로 모든 방향으로 이동할 수 있도록 구성하는 방법을 실제로 파악하지 못함)를 사용하려고했습니다.

분필 운동의 품질을 향상시키는 방법에 대한 힌트를 줄 수 있습니까?

감사합니다. u는 사용하는 분필 영상의 크기를 감소

답변

-2

운동을 계산하는 방법을 다시 작성 했으므로 조금 더 부드럽습니다. 완벽하지는 않지만 충분합니다.

+2

안녕 당신은 어떻게 해결책을 얻었습니까?제발 저도 같은 문제에 직면하고 있습니다. –

+0

View Controller의 다른 부분의 크기와 성능에 미치는 영향을 줄였습니다. 조금 도와 줬지만, 내가 완벽하지는 않다고 말했다. 이것은 오래 전 일 이었음을 기억하십시오 ...이 튜토리얼은 부드럽게 그릴 수있는 방법을 보여줍니다 : http://code.tutsplus.com/tutorials/smooth-freehand-drawing-on-ios--mobile-13164 나는 당신을 생각합니다. 언급 된 기술 중 일부를 채택 할 수 있습니다. 아마 이것은 도움이 될 것입니다. – Cornelius

0

봅니다 .... 편집
는 : 크기에 의해
i는 이미지 파일의 크기를 의미했다.
비슷한 문제에 직면했을 때 도움이되었습니다. 이 구성 요소에서

+0

나는 크기를 대폭 제거했지만 여전히 뒤떨어져 있으며 움직임은 실제로 부드럽지 않습니다. 또한 크기 조정은 디자인의 일부이기 때문에 실제로 옵션이 아닙니다. – Cornelius

+0

파일 크기는 어떻습니까? – Dancreek

1

다음 tapGesture 방법 방법은 나를 위해 원활하게 작동합니다

- (void)handlePan:(UIPanGestureRecognizer*)gesture{ 
View* view = (View*)gesture.view; 

if (gesture.state == UIGestureRecognizerStateEnded){ 
    view.dragStartingPoint = CGPointZero; 
    return; 
} 

CGPoint point = [gesture locationInView:gesture.view]; 

if (gesture.state == UIGestureRecognizerStateBegan){ 
    view.dragStartingPoint = point; 
    view.dragStartingFrame = view.frame; 

    return; 
} 

if (CGPointEqualToPoint(view.dragStartingPoint, CGPointZero)) 
    return; 

CGFloat x = view.dragVerticallyOnly? view.frame.origin.x: view.dragStartingFrame.origin.x + point.x - view.dragStartingPoint.x; 
CGFloat y = view.dragHorizontallyOnly? view.frame.origin.y: view.dragStartingFrame.origin.y + point.y - view.dragStartingPoint.y; 

if (self.dragVerticallyOnly == NO){ 
    if (x < view.dragMinPoint.x){ 
     x = view.dragMinPoint.x; 
    } 
    else if (x > self.dragMaxPoint.x){ 
     x = view.dragMaxPoint.x; 
    } 
} 
if (self.dragHorizontallyOnly == NO){ 
    if (y < view.dragMinPoint.y){ 
     y = view.dragMinPoint.y; 
    } 
    else if (y > self.dragMinPoint.y){ 
     y = view.dragMinPoint.y; 
    } 
} 

CGFloat deltaX = x - view.frame.origin.x; 
CGFloat deltaY = y - view.frame.origin.y; 
if ((fabs(deltaX) <= 1.0 && fabs(deltaY) <= 1.0)) 
    return; // Ignore very small movements 

[UIView animateWithDuration:0.1 animations:^{ 
    view.frame = CGRectMake(x, y, view.frame.size.width, view.frame.size.height); 
}]; 

은}

가장 중요한 포인트는

  1. 는 애니메이션 옵션으로 이동합니다; (10 분의 1 초가 잘 된 것처럼 보입니다).
  2. 필요하지 않을 때 움직임을 피하십시오. 약간의 계산을하면 느려지지는 않지만 불필요한 움직임을 만들 수 있습니다. 그러나 많은 움직임을 피할 수 없으면 사용자 팬 제스처를 따르지 않습니다.

보기를 어떻게 바라는가에 따라 더 많은 최적화가 이루어질 수 있습니다.

참고 : 내 방법은 필요한 경우 경계와 이동 방향 제한도 고려합니다. 예를 들어, 제 경우에는 속도 제한을 추가했습니다. 사용자가 특정 팬 속도를 넘으면 나는 더 이상의 팬 제스처를 무시하고 사용자가 가리키고있는 위치 (애니메이션) 및 그 속도로 이동합니다. 같은 경우에는 의미가있을 수도 있고 그렇지 않을 수도 있습니다. 내 것이 었습니다!

내가 도움이 되었기를 바랍니다.

관련 문제