CAAnimation 层取消视图的 previos 变换

Posted

技术标签:

【中文标题】CAAnimation 层取消视图的 previos 变换【英文标题】:CAAnimation layer cancels previos transformation of the view 【发布时间】:2012-03-26 14:33:20 【问题描述】:

我正在对 UIIMageView 使用简单的转换动画。

    [UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseInOut animations:^
        CGAffineTransform translate = CGAffineTransformMakeTranslation(0, -[self percentFromHeight:20]);
        clueImage.transform = translate;
     completion:^(BOOL finished) 
        [self.cluWordSelectionView setaWordsObjects:[NSArray arrayWithArray:[self.whiteCard clueWordObjectsForSoundAtIndex:self.index]]];

        [self addSubview:cluWordSelectionView];
        [clueImage.layer addAnimation:[Animations shakeAnimation] forKey:@"shake"];

    ];

正如您在完成后看到的那样,我正在向视图中添加另一个抖动动画:

[clueImage.layer addAnimation:[Animations shakeAnimation] forKey:@"shake"];

看起来像这样:

+(CAAnimation*)shakeAnimation 

CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];

CGFloat wobbleAngle = 0.06f;

NSValue* valLeft = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(wobbleAngle, 0.0f, 0.0f, 1.0f)];
NSValue* valRight = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(-wobbleAngle, 0.0f, 0.0f, 1.0f)];
animation.values = [NSArray arrayWithObjects:valLeft, valRight, nil];
animation.beginTime = 3;
animation.autoreverses = YES;  
animation.duration = 0.125;
animation.repeatCount = HUGE_VALF;  

return animation;


问题是当shakeAnimation 启动时,视图会“跳”回原来的位置。我怎样才能防止这种情况发生?为什么会这样?

谢谢

沙尼

【问题讨论】:

【参考方案1】:

新动画应该考虑到当前的变换(翻译):

    CATransform3D leftTransform = CATransform3DMakeRotation(wobbleAngle, 0.0f, 0.0f, 1.0f);
    leftTransform = CATransform3DConcat(layer.transform, leftTransform);
    CATransform3D rightTransform = CATransform3DMakeRotation(-wobbleAngle, 0.0f, 0.0f, 1.0f);
    rightTransform = CATransform3DConcat(layer.transform, rightTransform);

    NSValue* valLeft = [NSValue valueWithCATransform3D:leftTransform];
    NSValue* valRight = [NSValue valueWithCATransform3D:rightTransform];

layer 是要设置动画的图层。

【讨论】:

非常感谢,顺便说一句,完成后我正在调用 [self setTransform:CGAffineTransformIdentity];到视图并删除图层上的所有动画。下次我尝试动画时,视图动画不起作用。 ant Idea 为什么? 我认为最好贴一些代码来解释这个问题。此外,如果您认为这与当前问题无关,最好发布一个新问题。

以上是关于CAAnimation 层取消视图的 previos 变换的主要内容,如果未能解决你的问题,请参考以下文章

CALayer (CAAnimation) 动画属性绘制错误

CAAnimation 跟踪进度

CAAnimation 在一个点上进行变换旋转

使用 CAAnimation 检测正在动画的 uiview 子视图的触摸

CAAnimation - 显示/隐藏持续时间为 0

停止 CAAnimation 以添加另一个 CAAnimation