iPhoneSDK设置CALayer.transform在动画完成后不起作用

时间:2010-08-25 13:26:13

标签: iphone core-animation calayer

我有一个CALayer对象。在viewDidLoad中:我使用layer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI/8.0, 0, 0, 1);为它设置了一个变换。这是有效的。

加载后,我应用CAKeyframeAnimation为该图层的旋转设置动画。它也可以正常工作和动画完成。为了防止图层在完成后删除动画,我使用

animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;

所有这一切都很好。但是当我尝试再次更改变换(没有动画)layer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI/8.0, 0, 0, 1);时会出现问题。什么都没发生。图层不会将其变换更改为我指定的变换。如果我再次运行动画,动画将会发生。但是如果没有动画,则无法更改转换属性。

感谢任何帮助..

2 个答案:

答案 0 :(得分:1)

首先,为什么要避免在完成后删除动画?你不需要这两行,

animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;

因为您实际上是在设置图层的transform属性。如果您想要的只是动画之后的最终视觉状态,同时保持变换与原始变换相同(坦率地说我从未使用过),那么这两行就是你会使用的。 / p>

接下来要注意的是,您要将变换设置为相同的值两次。默认情况下,在图层上设置变换不是附加的。我的意思是,当你期望它从最终转换状态再次进行第一次转换并连接相同的转换时,它对你正在使用的代码不起作用。您将看不到更改,因为您将状态设置为已有的状态。

我还没有尝试过,但我认为你可以采取第一个转换并连接新的转换。类似的东西:

layer.transform = CATransform3DRotate(layer.transform, M_PI/8.0, 0, 0, 1);

注意我是如何从图层的当前变换(CATransform3DRotate的第一个参数)开始的,而不是身份。试一试。如果它不起作用,请尝试类似:

layer.transform = CATransform3DConcat(layer.transform, 
                             CATransform3DMakeRotation(M_PI/8.0, 0, 0, 1));

答案 1 :(得分:0)

好的,我设法让这个工作。 我所做的是在致电layer.tranform后立即设置[layer addAnimation:]。这样,在动画完成后,图层将保持原样所需的位置。这是我的代码:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.repeatCount = 1;
animation.duration = 3.0;
animation.fromValue = [NSNumber numberWithDouble:currentRotationAngle];
animation.toValue = [NSNumber numberWithDouble:newRotationAngle];

[layer addAnimation:animation forKey:@"rotationAnimation"];
[layer setAffineTransform:CGAffineTransformMakeRotation(newRotationAngle)];

我遇到的问题是使用layer.removedOnCompletionlayer.fillemode。我不必使用它们。在新方式中,图层将在动画完成后使用layer.transform显示图层。 CAAnimations仅在动画时更新图层的presentationLayer(维护图层的视觉状态)。动画完成后,它会将图层的视觉状态恢复为layer.transform强加的视觉状态。