Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone SDK设置CALayer.transform在动画完成后不起作用_Iphone_Core Animation_Calayer - Fatal编程技术网

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

iPhone SDK设置CALayer.transform在动画完成后不起作用,iphone,core-animation,calayer,Iphone,Core Animation,Calayer,我有一个CALayer对象。在viewDidLoad中:我使用layer.transform=CATTransformsM3dRotate(CATTransformsM3DidEntity,M_PI/8.0,0,0,1)为它设置一个转换这是有效的 加载后,我应用CAKeyframeAnimation为该层的旋转设置动画。它也可以正常工作,动画也可以正确完成。为了防止层在完成后删除动画,我使用 animation.removedOnCompletion = NO; animation.fillMo

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

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

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


感谢您的帮助。

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

animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
因为您实际上是在设置层的变换特性。如果您只想在动画后获得最终的视觉状态,同时保持变换与原始状态相同(坦白地说,我从来没有使用过),那么您将使用这两条线

接下来您必须意识到的是,将变换设置为相同的值两次。默认情况下,在层上设置变换不是相加的。我的意思是,虽然您希望它进行第一次转换,并从最终转换状态再次连接相同的转换,但对于您正在使用的代码,它不起作用。您将不会看到更改,因为您正在将状态设置为它已经具有的状态

我还没有尝试过,但我认为您可能会采用第一个变换并连接新的变换。比如:

layer.transform = CATransform3DRotate(layer.transform, M_PI/8.0, 0, 0, 1);
layer.transform = CATransform3DConcat(layer.transform, 
                             CATransform3DMakeRotation(M_PI/8.0, 0, 0, 1));
请注意,我是如何从层上的当前变换(CATTransformM3dRotate的第一个参数)开始的,而不是从标识开始的。试试看。如果不起作用,请尝试以下操作:

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

好的,我设法让它工作了。 我所做的是在调用
[layer addAnimation:
之后设置
层.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.removedOnCompletion
layer.fillemode
。我不必使用它们。在动画完成后,层将以新的方式使用
层.transform
显示层<代码>动画
仅在设置动画时更新层的presentationLayer(保持层的视觉状态)。动画完成后,它会将层的视觉状态还原为
层施加的视觉状态。transform

好的,我需要保留最终的视觉状态(动画之后),直到我稍后手动将其设置为新值。这就是为什么我设置removedOnCompletion=NO;我知道变换和连接它们,但即使我在动画之后将变换设置为不同的值(M_PI/8.0除外),它也不会在视觉上反映出来。在使用当前代码制作动画后,层的视觉状态似乎被锁定。我想我会尽量避免使用removedOnCompletion的东西,并在animationDidStop中手动设置layer.transform。我不知道它是否有效。我会尝试在这里发布。我也做过同样的一次(removedOnCompletion=NO,fillMode=kCAFillModeForwards)。但后来我发现,在恢复应用程序状态(从非活动/后台到活动/前台)时,这会产生一些效果。我看到的是,模型值用于恢复屏幕上的层,然后整个动画执行(忽略持续时间值)。它只出现在一个iPhone或iPad模拟器上(我记不起是哪一个)。