想知道如何轻弹或推送UIView,例如http://www.cardflick.co/或https://squareup.com/cardcase演示视频。
我知道如何拖动物品,但是你如何赋予它们重力/惯性。这是由IOS处理的吗?
答案 0 :(得分:42)
你所描述的模拟重力/惯性之王的效果可以通过缓出(快速启动,慢速结束)和轻松(开始慢速,快速结束)计时功能来产生。 / p>
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>
}
}
答案 1 :(得分:1)
iOS没有任何内置的重力/惯性API。您最好的选择是:
使用动画模拟效果:如果您向对象轻弹对象(它不需要反弹),只需将其发送到目标并调整即可获得相当不错的结果动画时间曲线。
使用物理库。 Chipmunk是高质量的,并且有很多iOS支持。您可以设置对象,为它们分配权重,描述它们的形状,然后库代码将为您提供更新的(x,y)坐标,以便您可以在屏幕上更新对象。
答案 2 :(得分:0)
iOS中没有内置任何功能,但您可以自己轻松实现。我首先创建一个手势识别器,识别你想要使用的“轻弹”手势,可能是寻找恒定方向和增加速度的东西。当您识别出这样的手势时,您只需要适当地为受影响的视图的位置设置动画。