ios - 如何在 iOS 上用用户手指平滑 move UIView

标签 ios ipad touch move

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

我使用 touchesBegan、touchesMoved 和 touchesEnded 实现了这一点。在 touchesMoved 中,我将 UIImageView 的中心 move 到当前触摸位置,并用核心图形从上一个位置到当前位置绘制一条线。

这很好用,但 ImageView move 不是很流畅,而且还滞后于触摸。我已经尝试使用 UIPanGestureRecognizer(没有识别手势)和我放置粉笔的 UIScrollView(没有真正弄清楚如何配置它以便它可以在各个方向上 move 得足够远)。

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

谢谢!

最佳答案

下面的 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. 使用动画选项制作 Action ; (十分之一秒似乎可以很好地完成工作)。
  2. 避免不必要的 Action 。进行一些计算不会使其变慢,但进行不必要的 move 可能会变慢。但是,您无法避免许多 Action ,否则它不会跟随用户的平移手势。

根据您希望 View 的行为方式,您可能需要进行更多优化。

备注:我的方法还考虑了您可以定义的边界和 move 方向限制,以备不时之需。例如,在我的例子中,我添加了速度限制。如果用户超过某个平移速度,我将忽略进一步的平移手势并以该速度 move 用户指向的 View (动画)。在相同的情况下,它可能有意义也可能没有意义。在我的,它做到了!

希望对您有所帮助!

关于ios - 如何在 iOS 上用用户手指平滑 move UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8925441/

相关文章:

iphone - iPhone/iPad/iPod网站的Web模板(根据应用商店的要求)

iphone - OpenGL ES 2.0 FBO 创建出错并出现未知错误

Javascript 支持触摸而不阻止浏览器捏合支持

android - Ontouch() 不适用于自定义 View ?

java - 触摸屏灵敏度

ios - 在没有动画的情况下关闭 View Controller 后立即显示 View Controller

ios - 如何创建像Wikipedia这样的Flutter应用程序

ios - 我可以将手势识别器的代码放在 View 的子类中吗?

ios - 所有设备尺寸 xcode 7 之间的按钮约束

iphone - iOS 能够在模拟器上读取 plist 文件,但不能在设备上读取