IOS 拖动、轻弹或轻弹 UIView

Posted

技术标签:

【中文标题】IOS 拖动、轻弹或轻弹 UIView【英文标题】:IOS drag, flick, or fling a UIView 【发布时间】:2011-09-30 15:11:32 【问题描述】:

想知道我将如何处理 UIView,例如 http://www.cardflick.co/ 或 https://squareup.com/cardcase 演示视频。

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

【问题讨论】:

【参考方案1】:

您所描述的模拟重力/惯性之王的那种效果可以通过缓出(开始快,结束慢)和缓入(开始慢,结束快)计时功能产生。

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>
    
 

【讨论】:

如果在动画完成前想再次平移,需要停止动画怎么办?动画始终运行直到完成。 尝试谷歌搜索“可中断动画”或发布新问题(如果您愿意,可以在此处的 cmets 中联系我)。 我发现在动画完成之前清除动画可以完成我的工作。谢谢。 最后的位置在哪里???这不是最重要的部分吗!【参考方案2】:

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

    用动画模拟效果:如果你将一个物体轻弹到一个目标上(它不需要从物体上反弹),你可以通过将它发送到目标并调整动画时序曲线。

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于IOS 拖动、轻弹或轻弹 UIView的主要内容,如果未能解决你的问题,请参考以下文章

iOS:啥速度阈值使平移手势成为轻弹?

UIScrollViewDelegate scrollViewDidScroll 方法跟不上高速滚动(轻弹)?

nodeAtPoint 错误的节点

轻弹手势期间的内容偏移

如何像足球一样轻弹 SKSpriteNode

在 iOS 中制作一个可拖动的 UIView 捕捉到边缘