如何在一个动画中链接CAAffineTransforms?

时间:2011-12-02 14:20:36

标签: objective-c ios core-animation

我正试图在他走路的时候制作精灵鲍勃,但无论我做什么,它都会翘起并停留,或者它同时做两个动画而你实际上并没有看到动作。下面我发布了我目前的代码。有人可以纠正我吗?

我也尝试过使用动画代理并使用animationDidStop,但它似乎也没有用。

- (void)walkAnimation {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:2];
    [UIView setAnimationRepeatCount:2];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationRepeatAutoreverses:TRUE];
    CGAffineTransform bobUP = CGAffineTransformMakeTranslation(0, -10);
    //CGAffineTransform bobDOWN = CGAffineTransformMakeTranslation(0, +10);
    //CGAffineTransform bob = CGAffineTransformConcat(bobUP, bobDOWN);
    _spriteLayer.affineTransform = bobUP;
    [UIView commitAnimations];
    _spriteLayer.affineTransform = CGAffineTransformIdentity;
}

1 个答案:

答案 0 :(得分:1)

您不能像接近它那样在一个动画中将这两个变换绑定在一起。 CGAffineTransformConcat创建一个转换,表示在另一个之后执行一个转换。第一个为y转换-10,然后第二个转换为y为+10。如果你一个接一个地做,你就回到了你开始的地方。将结果变换分配给精灵图层时,只需告诉它不要移动。

您有两种方法可以实现您的目标:

选项1:查看关键帧动画(查找CAKeyframeAnimation)。这些将允许您通过动画指定不同点的属性状态。这可能需要更多的学习,但最终结果可能更具可读性和可维护性。

选项2:有两个动画 - 每个翻译一个。在每个动画结束时,如果您想继续摆动,则触发另一个动画。如果您需要稍后进行更改,这可能会让您感到困惑和难以跟上。

另外,无论哪种方式,我建议您使用常量来表示翻译价值。魔术数字也将使未来的变化需要更多的努力。您还应该为UIView动画使用块动画(查找animateWithDuration:动画:)