如何在iOS上用用户手指平滑移动UIView

时间:2012-01-19 11:41:23

标签: ios ipad touch move

在我的应用程序中,我有一个代表粉笔的UIImageView。用户可以将其选中并将其拖动到屏幕上以进行绘制。

我使用touchesBegan,touchesMoved和touchesEnded实现了它。在touchesMoved中,我将UIImageView的中心移动到当前触摸位置,并从最后一个位置绘制一条核心图形到当前位置。

效果很好,但图像视图移动不是很平滑,而且还落后于触摸。我已经尝试使用UIPanGestureRecognizer(不识别手势)和UIScrollView,我在其中放置了粉笔(没有真正弄清楚如何配置它以便它可以在所有方向上移动得足够远)。

你能给我一些提示,如何改善粉笔运动的质量吗?

谢谢!

4 个答案:

答案 0 :(得分: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. 使用动画选项进行移动; (十分之一秒似乎做得很好)。
  2. 不必要时避免移动。进行一些计算不会让它变慢,但可能会做出不必要的动作。但是你不能避免许多动作,否则它将不会跟随用户平移手势。
  3. 根据您希望视图的行为方式,您可能需要进行更多优化。

    备注:我的方法还考虑了您可能在需要时定义的边界和移动方向限制。例如,在我的情况下,我添加了速度限制。如果用户超出某个平移速度,我只是忽略进一步的平移手势并移动用户指向的视图(动画),并以该速度移动。在相同的情况下,它可能有意义或无意义。在我的,它做到了!

    我希望我得到了一些帮助!

答案 1 :(得分:0)

尝试减小正在使用的粉笔图像的大小....
已编辑:
按尺寸,我指的是图像文件大小。
当我遇到类似问题时,它帮助了我。

答案 2 :(得分:0)

看看这个组件:spuserresizableview http://cocoacontrols.com/platforms/ios/controls/spuserresizableview

源代码非常简单,可以帮助您理解视图处理。

答案 3 :(得分:-2)

我重写了如何计算运动,现在它变得更平滑了。不完美,但这已经足够了。