SKBounceAnimation 1.0.04

SKBounceAnimation 1.0.04

测试已测试
语言语言 Obj-CObjective C
许可证 自定义
发布最新版本2014年12月

Soroush Khanlou 维护。



  • khanlou

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 支持的几个不同动画的演示。

  • 一轴动画:使用 keypath 如 位置.x,我们可以沿一个轴进行动画。
  • 双轴动画:使用像 position 这样的关键路径,SKBounceAnimation 会生成一条路径,并且您的层级将跟随它。
  • 尺寸:使用 bounds 关键路径,我们可以使尺寸增加。尺寸增加的中心点由 anchorPoint 确定,可以移动。默认为层中心。
  • 颜色:我不知道为什么有人会想要动画颜色的弹性效果,但我觉得有点异想天开,所以我加上了对此的支持。
  • 缩放:使用 CATransform3D 结构和 transform 关键路径,我们可以缩放对象。这在创建类似于弹出的 UIAlert 效应非常有用。anchorPoint 也会判断这个效果是如何发生的。
  • 缩放与旋转:在顶部叠加多个 CATransform3D,我们可以实现像缩放和旋转这样的非常奇怪的效果。它们看起来非常酷。
  • 矩形:最后一个示例创建了两个 SKBounceAnimations,它们具有两个不同的 keyPathpositionbounds),但将它们附加到同一个层级上。效果看起来像是一个 frame 动画。

其他说明

SKBounceAnimation 不支持 byValue 属性。