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
处理您的手势,手势识别器将为您提供两个重要信息来计算最终位置:velocity
和translation
,它们分别表示对象移动的速度和距离.
您可以在视图中安装平移手势识别器(我猜这将是您想要动画的对象),如下所示:
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的主要内容,如果未能解决你的问题,请参考以下文章