Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS时变动画_Ios_Time_Uiviewanimation_Varying - Fatal编程技术网

iOS时变动画

iOS时变动画,ios,time,uiviewanimation,varying,Ios,Time,Uiviewanimation,Varying,我对为视图制作类似抖动的动画感兴趣,类似于中所述 及 但是,这些解决方案实现了时间不变的动画,这意味着动画序列在动画开始之前是固定的,并且一次又一次地执行完全相同的动画。在这些情况下,旋转角度是预先计算的 我想做的是时变动画,动画随时间变化。在前面的例子中,我希望旋转角度根据一些基于时间的函数而变化 给一个现实生活的类比,想象一下我正在制作一块果冻的动画。在动画开始时,我击打果冻一次,果冻开始摇晃,然后随着时间的推移,晃动的大小逐渐减小,直到它完全不摇晃为止 根据我的理解,我不能向动画块中注入随

我对为视图制作类似抖动的动画感兴趣,类似于中所述

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

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

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

根据我的理解,我不能向动画块中注入随时间变化的值,我认为唯一可行的方法是根据需要将固定动画的字符串链接在一起。随着3或4块递减的动画值串在一起,我应该会得到一个可以接受的效果

那么,如果有一种方法可以通过UIView动画实现我想要的效果呢?还是我应该采用另一种方法

[编辑]

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

For t<0 f(t) = 0
For t>0 and t<1 f(t) = 1-t
For t>1 f(t)= 0
t0和t1的
f(t)=0
实际上,f(t)的更好表示形式如下:

f(t) = A(t)sin(Sorry, you can't do that with UIView animations without chaining multiple of them together by triggering the next in the completion block and you really shouldn't do that.

But don't worry, what you have to do isn't that hard.

Core Animation supports key-frame animations of a property where you can specify an array of values that the property should animate between. You could also specify a path where the property will read its values from.

If you specify an array of values you have fine grained control over the time between the values and how the interpolation (calculation between the specified values) are done.

You create a new animation like this

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

f(t)=A(t)sin(对不起,如果不通过触发完成块中的下一个来将多个UIView动画链接在一起,则无法使用UIView动画实现此功能,您确实不应该这样做

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

核心动画支持一个属性,在该属性中,您可以指定该属性应在其中设置动画的值数组。您还可以指定该属性从中读取其值的路径

如果指定一个值数组,则可以对值之间的时间以及插值(指定值之间的计算)的执行方式进行细粒度控制

您可以像这样创建一个新动画

[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
由于要将对象添加到NSArray中,因此它们必须包含在对象中。对于数字,这意味着使用
NSNumber
s。对于类似点、矩形或变换,有一个名为
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
然后,要运行动画,请将其添加到应设置动画的视图层,如下所示

[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
导入到您的项目中,并将
包含到您的代码中。

我知道关键帧动画,但这似乎仍然会引导我在开始动画之前必须预先计算动画值。是的,我可以更好地控制如何使用它插值发生了,但它似乎仍然是固定值的插值,而不是时变值的插值。以关键帧动画为例,我想将值指定为值=f(t),这是在时间t的每个“动画周期”的计算机,其中f(t)本身随时间而变化。任何内置动画都不支持这一点(据我所知)。也许你可以将CAPropertyAnimation子类化,然后自己做(或者将CAValueFunction子类化(做插值的类)我还没有尝试过这些东西,所以我不确定它们是否真的很难做到,或者它是否会起作用。是的。我想我对标准动画很满意,对这些标准类进行子类化似乎有点太难了。我可以用它来实现我想要的一个OpenGL解决方案,但这对于这个应用来说太过分了。