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

3
在我的应用程序中,我有一个UIImageView代表一块粉笔。用户可以拿起它并将其拖动到屏幕上进行绘画。
我使用touchesBegan、touchesMoved和touchesEnded实现了这个功能。在touchesMoved中,我将我的UIImageView的中心移动到当前触摸位置,并使用核心图形从上一个位置到当前位置绘制一条线。
这个方法很有效,但是UIImageView的移动不太平滑,而且落后于触摸。我已经尝试使用UIPanGestureRecognizer(无法识别手势)和UIScrollView,在其中放置了粉笔(没有真正弄清楚如何配置它,以便可以在所有方向上移动足够远)。
您能给我一些提示,如何改进粉笔移动的质量吗?
谢谢!
4个回答

1
以下tapGesture方法对我很顺畅: ```

以下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. 避免在不必要时进行移动。 进行某些计算不会使其变慢,但进行不必要的移动可能会使其变慢。 但是,您不能避免太多移动,否则它将无法跟随用户的平移手势。

根据您想让视图如何表现,可能还有更多优化需要进行。

注意:我的方法还考虑了您可能需要定义的边界和移动方向限制。 例如,在我的情况下,我添加了一个速度限制。 如果用户超过某个平移速度,我只会忽略进一步的平移手势,并以用户指向的位置和速度(动画方式)移动视图。 在某些情况下可能有意义,也可能没有。 在我的情况下是有用的!

希望我能对您有所帮助!


0
尝试减小你正在使用的Chalk图像的大小...
编辑:
我指的是图像文件的大小。
当我遇到类似问题时,这对我有所帮助。

我大幅度减小了尺寸,但仍然存在滞后,并且移动并不真正流畅。同时,重新调整大小并不是一个真正的选项,因为它是设计的一部分... - Cornelius

0

-3
我重新编写了移动的计算方式,现在流畅了一些。虽然不完美,但已经足够了。

2
嘿,你是怎么解决的?请帮帮我,我也遇到了同样的问题。 - Zalak Patel
我减小了视图控制器其他部分的大小和性能影响。虽然有些帮助,但并不完美。请记住这是很久之前的事情... 这个教程展示了如何实现平滑绘图:http://code.tutsplus.com/tutorials/smooth-freehand-drawing-on-ios--mobile-13164 我想你可以借鉴其中提到的一些技术。或许这会对你有所帮助。 - Cornelius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接