1

我有兴趣为视图做类似动画的抖动,类似于中描述的内容

ios-icon-jiggle-algorithmerror-in-button-jiggle-algorithm

然而,这些解决方案实现了时不变动画,这意味着动画序列在动画开始之前是固定的,并且一遍又一遍地执行完全相同的动画。在这些情况下,旋转角度是预先计算的。

我想做的是时变动画,其中动画随时间变化。在前面的示例中,我希望旋转角度根据一些基于时间的函数而变化。

打个比方,想象一下我正在为一块果冻制作动画。在动画开始时,我敲击果冻一次,它开始摇晃,然后随着时间的推移,摇晃的大小逐渐减小,直到它完全不摇晃。

据我了解,我无法将随时间变化的值注入到动画块中,我认为唯一可行的做法是按照ios-multiple-animation-blocks将固定动画字符串链接在一起。将 3 或 4 个递减动画值串在一起,我应该会得到一个可以接受的效果。

那么,如果有办法用 UIView Animations 做我想做的事呢?还是我应该采用另一种方法?

[编辑]

为了更清楚我所说的时变的含义,我希望能够将动画属性的值指定为函数时间,而不必先验地预先计算动画属性。并且以一种(可能)允许我即时修改功能的方式这样做。作为一个具体的例子,我可能想要一个函数 f(t) :

For t<0 f(t) = 0
For t>0 and t<1 f(t) = 1-t
For t>1 f(t)= 0

实际上,更好的 af(t) 表示形式如下:

f(t) = A(t)sin(t)

[编辑#2]

经过一番考虑,我决定,虽然理想情况下能够指定随时间变化的视图动画是我想要做的效果,但实际上,当它应用在应用程序中时,用户可能不会注意到我的编程能力。所以我只是要伪造它并使用预先计算并多次触发的关键帧动画。

4

1 回答 1

0

抱歉,如果不通过触发完成块中的下一个将多个动画链接在一起,您就无法使用 UIView 动画执行此操作,您真的不应该这样做。

但别担心,你要做的并不难。

Core Animation 支持属性的关键帧动画,您可以在其中指定属性应在其间进行动画处理的值数组。您还可以指定属性将从中读取其值的路径。

如果您指定一个值数组,您可以对值之间的时间以及如何完成插值(指定值之间的计算)进行细粒度控制。

你像这样创建一个新动画

CAKeyframeAnimation *myJiggleAnimation = [CAKeyframeAnimation animationWithKeyPath:nameOfPropertyBeingAnimated];
// example key paths could be @"position" or @"transform"
[myJiggleAnimation setValues:[NSArray arrayWithValues:/* your values here */]];

由于您要向 NSArray 添加对象,因此它们必须包含在对象中。对于数字,这意味着使用NSNumbers。对于这样的点、矩形或变换,有一个名为的类NSValue可以包装这些,像这样

[NSValue valueWithCGPoint:myPoint]; 
[NSValue valueWithCGSize:mySize];
[NSValue valueWithCGRect:myRect]; 
[NSValue valueWithCATransform3D:myTransform]; // 3D transform
[NSValue valueWithCGAffineTransform:myAffineTransform]; // 2D transform 

然后运行动画,你将它添加到应该动画的视图层,像这样

[[myView layer] addAnimation:myJiggleAnimation forKey:@"jiggle"];
// The key is used so that you can reference the animation if you have to

请注意,在动画结束时,动画属性的值不会改变,因此视图可能会跳回原始状态。这是预期的行为。要让它以另一个值结束,只需在将动画添加到图层后将属性设置为其结束值。


注意:由于它是核心动画,因此您必须将其导入QuartzCore.framework您的项目并包含<QuartzCore/QuartzCore.h>在您的代码中。

于 2012-07-17T21:28:43.497 回答