SKBounceAnimation
是一个 CAKeyframeAnimation
子类,它根据起始值和结束值以及弹跳次数为您创建动画。它是基于这篇博客中的数学和技术:khanlou.com/2012/01/cakeyframeanimation-make-it-bounce/,而这篇博客部分基于此处 Matt Gallagher 的作品:cocoawithlove.com/2008/09/parametric-acceleration-curves-in-core.html。
基本代码很简单
NSString *keyPath = @"position.y";
id finalValue = [NSNumber numberWithFloat:300];
[view.layer setValue:finalValue forKeyPath:keyPath];
SKBounceAnimation *bounceAnimation = [SKBounceAnimation animationWithKeyPath:keyPath];
bounceAnimation.fromValue = [NSNumber numberWithFloat:view.center.x];
bounceAnimation.toValue = finalValue;
bounceAnimation.duration = 0.5f;
bounceAnimation.numberOfBounces = 2;
[view.layer addAnimation:bounceAnimation forKey:@"someKey"];
我们将 keypath 的值设置为最终值,然后执行动画。当动画完成后,它将自动从层中移除,并传递给 finalValue
。如果您没有使用 -(void)setValue:forKeyPath:
,那么原始的 keyPath 值将会接管,动画将在动画结束后瞬间回到原始位置。
要了解更多关于数学的信息,请查看博客文章和其前一篇信息文章的详细信息,但基本上系统以振荡指数衰减的形式表现,形式为方程:x = Ae^(-αt)•cos(ωt) + B
。
A 是起始值和结束值之间的差异,B 是结束值,α 是确定指数衰减部分接近 0 所需帧数的量,ω 是确定达到所需弹跳次数所需的周期数。
shouldOvershoot
是一个可以更改的属性。默认值为 YES
;如果您将其设置为 NO
,则动画将像撞到墙面一样弹跳,而不是超过目标值然后弹回。它看起来非常像 Keynote 中的砧锤效果。
shake
是一个控制振荡函数的属性。将其设置为 YES
允许您晃动元素而不是移动它。要使用它,请将 fromValue
设置为元素最大移动量,将 toValue
设置为其当前位置。它使用正弦波而不是余弦波来进行振荡,因为它从 0(即当前位置)开始。
stiffness
是一个决定“弹簧”组件应该有多硬的属性。可接受值有
SKBounceAnimationStiffnessLight
SKBounceAnimationStiffnessMedium
SKBounceAnimationStiffnessHeavy
默认值为 SKBounceAnimationStiffnessMedium
。
演示应用包含 SKBounceAnimation
支持的几个不同动画的演示。
位置.x
,我们可以沿一个轴进行动画。position
这样的关键路径,SKBounceAnimation
会生成一条路径,并且您的层级将跟随它。bounds
关键路径,我们可以使尺寸增加。尺寸增加的中心点由 anchorPoint
确定,可以移动。默认为层中心。CATransform3D
结构和 transform
关键路径,我们可以缩放对象。这在创建类似于弹出的 UIAlert 效应非常有用。anchorPoint
也会判断这个效果是如何发生的。CATransform3D
,我们可以实现像缩放和旋转这样的非常奇怪的效果。它们看起来非常酷。SKBounceAnimations
,它们具有两个不同的 keyPath
(position
和 bounds
),但将它们附加到同一个层级上。效果看起来像是一个 frame
动画。SKBounceAnimation
不支持 byValue
属性。