ios - 如何将具有相同属性的一系列动画链接到三个不同的对象上?

标签 ios core-animation

我一直在尝试创建一系列动画,依次处理扑克牌中的三张牌。我只想为三张卡片的位置设置动画——假设第一个动画在第一张卡片的位置立即开始并持续 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++);
        // ...
    }
    
  • 将每张卡片的动画包裹在一个组中。出于某种原因,我不太明白,这会将这些动画置于一个共同的时间尺度上,即使这些组彼此分开。 It's worked for some ,但我有点不愿意相信它——在远处看起来像是幽灵般的 Action 。

  • 无论哪种方式,您可能还希望图层在动画结束时保持在它们所在的位置。您可以像这样使动画“粘住”:
    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/

    相关文章:

    android - 将 Xamarin.Android 项目转换/移植到 Xamarin.iOS

    ios - 使用 Xcode 6 编译的应用程序在 iPhone 5s 顶部/底部屏幕空白上运行

    ios - Facebook v2 与 iOS SDK 集成

    iphone - 什么时候在 Mac/iPhone 上使用 CALayer?

    iphone - 同步 CAAnimations

    python - 使用 Python 和 GAE 对编码的 URL 查询参数进行不一致的解码

    ios - Xamarin 图像集不导入

    Objective-C - CABasicAnimation 在动画后应用更改?

    ipad - iPad 上的核心动画截图

    ios - iOS 动画 block 如何工作?