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

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

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

【问题讨论】:

    标签: ios drag-and-drop


    【解决方案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。您的最佳选择是:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-22
        • 2019-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        相关资源
        最近更新 更多