2010-08-25 56 views
0

我有一个CALayer对象。在viewDidLoad中:我使用layer.transform = CATransform3DRotate(CATransform3DIdentity, M_PI/8.0, 0, 0, 1);设置了一个转换。iPhoneSDK设置动画完成后,CALayer.transform不起作用

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

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

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

任何帮助表示赞赏..

回答

0

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

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所规定的状态。

1

首先,你为什么要避免删除完成后的动画?你不需要这两条线,因为你实际上是在设置图层的transform属性,所以你不需要这两条线,

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

。如果你想要的只是动画之后的最终状态,而保持变形与原始变形相同(坦率地说我从来没有用过),那么这两条线就是你要使用的。

您必须认识的下一件事是您将转换设置为相同的值两次。在图层上设置变换默认情况下不具有可加性。我的意思是,虽然您期待它进行第一次转换,并再次从最终转换状态连接相同的转换,但它不会以您使用的代码的方式工作。由于您将状态设置为已有状态,因此您不会看到更改。

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

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)); 
+0

那么,我需要最后的视觉状态(动画之后)保持,直到我手动将它设置为一个新值。这就是为什么我设置removedOnCompletion = NO; 我知道变换和连接它们,但即使在动画之后将变换设置为不同的值(M_PI/8.0以外),它也不会直观地反映出来。看起来好像该层的视觉状态在用我当前的代码进行动画之后被锁定。 我想我会尽量避免使用removedOnCompletion的东西,并与手动设置animationDidStop中的layer.transform。我不知道它是否有效。我会尽力在这里发表。 – ravinsp 2010-08-29 08:07:40

+0

我做过一次(removedOnCompletion = NO,fillMode = kCAFillModeForwards)。但后来我看到这在恢复应用程序状态时(从不活动/背景到活动/前景)有一些效果。我看到的是它是**模型值**,它用于恢复屏幕上的图层,然后执行整个动画(忽略持续时间值)。这只是在iPhone或iPad模拟器之一(我不记得哪一个)。 – debleek63 2011-11-10 12:58:49