IOS拖动,轻弹或者扔掉UIView

时间:2011-07-07 16:30:05

标签: ios drag-and-drop inertia

想知道如何轻弹或推送UIView,例如http://www.cardflick.co/https://squareup.com/cardcase演示视频。

我知道如何拖动物品,但是你如何赋予它们重力/惯性。这是由IOS处理的吗?

3 个答案:

答案 0 :(得分:42)

你所描述的模拟重力/惯性之王的效果可以通过缓出(快速启动,慢速结束)和轻松(开始慢速,快速结束)计时功能来产生。 / p>

iOS中提供了对缓和和缓和的支持,因此我认为您不需要任何外部库也不需要努力工作(尽管如您所想,您的效果需要进行大量微调)。

这将使对象转换为具有缓出效果的给定位置的动画:

 [UIView animateWithDuration:2.0 delay:0
         options:UIViewAnimationOptionCurveEaseOut
         animations:^ {
               self.image.center = finalPosition;
         }
         completion:NULL];
 }

如果您通过UIPanGestureRecognizer处理手势,手势识别器会为您提供两个重要信息来计算最终位置:velocitytranslation,分别表示速度和对象移动了多少。

你可以在你的视图中安装一个平移手势识别器(这可能就是你想要设置动画的对象),如下所示:

    UIPanGestureRecognizer* panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
    [yourView addGestureRecognizer:panGestureRecognizer];
            [panGestureRecognizer release];

然后在处理程序中处理动画:

 - (void)handlePanFrom:(UIPanGestureRecognizer*)recognizer {

    CGPoint translation = [recognizer translationInView:recognizer.view];
    CGPoint velocity = [recognizer velocityInView:recognizer.view];

    if (recognizer.state == UIGestureRecognizerStateBegan) {    
    } else if (recognizer.state == UIGestureRecognizerStateChanged) {
        <track the movement>
    } else if (recognizer.state == UIGestureRecognizerStateEnded) {
        <animate to final position>
    }
 }

答案 1 :(得分:1)

iOS没有任何内置的重力/惯性API。您最好的选择是:

  1. 使用动画模拟效果:如果您向对象轻弹对象(它不需要反弹),只需将其发送到目标并调整即可获得相当不错的结果动画时间曲线。

  2. 使用物理库。 Chipmunk是高质量的,并且有很多iOS支持。您可以设置对象,为它们分配权重,描述它们的形状,然后库代码将为您提供更新的(x,y)坐标,以便您可以在屏幕上更新对象。

答案 2 :(得分:0)

iOS中没有内置任何功能,但您可以自己轻松实现。我首先创建一个手势识别器,识别你想要使用的“轻弹”手势,可能是寻找恒定方向和增加速度的东西。当您识别出这样的手势时,您只需要适当地为受影响的视图的位置设置动画。