我一直在尝试创建一系列动画,依次处理扑克牌中的三张牌。我只想为三张卡片的位置设置动画——假设第一个动画在第一张卡片的位置立即开始并持续 0.4 秒,第二个动画在 0.4 秒后开始,持续时间相同,最后一个动画在 0.8 秒后开始。我无法弄清楚如何做到这一点!下面的代码不起作用。也许我需要使用 CAGroupAnimation
,但我不知道如何制作一组顺序
同一属性上的动画!
CGFloat beginTime = 0.0;
for (Card *c in cards) {
CardLayer *cardLayer = [cardToLayerDictionary objectForKey:c];
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
anim.fromValue = [NSValue valueWithCGPoint:stockLayer.position];
anim.toValue = [NSValue valueWithCGPoint:wasteLayer.position];
anim.duration = 0.4;
anim.beginTime = beginTime;
beginTime += 0.4;
cardLayer.position = wasteLayer.position;
[cardLayer addAnimation:anim forKey:@"position"];
…
}
最佳答案
就像爱因斯坦说的,time is relative .所有图层的beginTime
s 是 relative to the timespace of their superlayer ---因为它不是动画,它们最终都是一样的。
看起来有两种可能的解决方案:
beginTime
相对于它:int i = 0; float delay = 0.4;
for (Card *c in cards) {
// ...
float baseTime = [cardLayer convertTime:CACurrentMediaTime() fromLayer:nil];
anim.beginTime = baseTime + (delay * i++);
// ...
}
无论哪种方式,您可能还希望图层在动画结束时保持在它们所在的位置。您可以像这样使动画“粘住”:
anim.fillMode = kCAFillModeForwards;
anim.removedOnCompletion = NO;
但这可能会在以后给你带来麻烦——图层的模型位置仍然是它开始的位置,如果你在动画之后调整它(比如拖动卡片),你可能会得到奇怪的结果。因此,将发牌动画包裹在
CATransaction
中可能是合适的。 ,在其上设置一个完成块,用于设置图层的最终位置。说到
CATransaction
s 带有完成块,您可以使用它们来使隐式动画按顺序发生(如果由于其他原因没有使用显式动画):[CATransaction begin];
[CATransaction setCompletionBlock:^{
[CATransaction begin];
[CATransaction setCompletionBlock:^{
card3Layer.position = wasteLayer.position;
}];
card2Layer.position = wasteLayer.position;
[CATransaction end];
}];
card1Layer.position = wasteLayer.position;
[CATransaction end];
关于ios - 如何将具有相同属性的一系列动画链接到三个不同的对象上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10202962/