链接核心动画动画

Jac*_*ack 34 cocoa core-animation objective-c

哪种是在Core Animation上下文中链接动画的最优雅和模块化的方式?

我的意思是做动画,当其他完成时开始(例如,改变position然后opacity)..正常的方法是直接改变属性:

layer.position = new_point;
layer.opacity = 0.0f;
Run Code Online (Sandbox Code Playgroud)

但这会同时做到这一点.我想让一个等待另一个.

那么为不同的对象链接动画呢?我读过关于CATransaction使用过的东西:

[CATransaction begin]
layer1.property = new_property;
[CATransaction begin]
layer2.property2 = new_property2;
[CATransaction commit];
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

但它似乎没有工作..

Mat*_*ong 76

您还可以使用动画分组并使用动画的beginTime字段.尝试这样的事情:

CABasicAnimation *posAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
[posAnimation setFromValue:[NSNumber numberWithFloat:0.0]];
[posAnimation setToValue:[NSNumber numberWithFloat:1.0]];
// Here's the important part
[posAnimation setDuration:10.0];
[posAnimation setBeginTime:0.0];

CABasicAnimation *borderWidthAnimation = [CABasicAnimation animationWithKeyPath:@"borderWidth"];
[borderWidthAnimation setFromValue:[NSNumber numberWithFloat:0.0]];
[borderWidthAnimation setToValue:[NSNumber numberWithFloat:1.0]];
// Here's the important part
[borderWidthAnimation setDuration:10.0];
[borderWidthAnimation setBeginTime:5.0];

CAAnimationGroup *group = [CAAnimationGroup animation];
[group setDuration:10.0];
[group setAnimations:[NSArray arrayWithObjects:posAnimation, borderWidthAnimation, nil]];

[layer addAnimation:group forKey:nil];
Run Code Online (Sandbox Code Playgroud)

请注意,整个动画的持续时间为10秒.第一个从第二个0开始,第二个从第5个开始.

  • 请注意,这很棒,但仅适用于应用于单个图层的动画. (10认同)

Dun*_*n C 5

正如Matt指出的那样,您可以为具有不同开始时间的同一层创建包含不同动画的动画组.您还可以为独立CAAnimation对象或CAAnimation组设置委托,并且每个动画完成后它将调用animationDidStop:finished:委托方法(请注意,属于组的动画不会调用其委托的animationDidStop:finished:方法.

我想出了一个很酷的技巧,使得使用该CAAnimation animationDidStop:finished:方法更加强大.我使用该方法使用setValue:forKey:键@"animationCompletionBlock"将一段代码添加到独立动画或动画组.然后我编写了一个通用animationDidStop:finished:方法,检查刚刚完成的动画@"animationCompletionBlock"键,如果找到它,则执行那里的代码块.

在github上查看这个项目,了解该技术的工作示例:

带完成块的CAAnimation演示

你也可以在里面设置一组动画

[CATransaction begin];
//...
[[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)

阻止,如你所说.执行此操作时,可以使用CATransaction类方法setCompletionBlock:在当前事务组中的所有动画完成时调用代码块.然后,一个事务的完成块可以触发下一个事务.