我尝试这样做:有一个已经旋转到某个值的视图,比方说15度。
想象一个旋转了15度的视图。
接下来,我只知道,我希望此视图将从当前的旋转旋转到40度。
想象一下,这个视图现在如何从15度旋转到40度。
对于练习,我想用CAKeyFrameAnimation来做到这一点。但问题是,我所能做的就是从哪里到哪里都难以明确。 UIView动画没有方便的“拾取当前状态”的东西,对吧?我该怎么做呢?
另外,无论需要多少旋转量,我都想为该旋转指定3个关键帧。
想象一下,该视图如何从15度旋转到40度,使用3个关键帧来实现这一目标
但是另一个大问题:可能会发生另一个动画必须使用不同的目标。假设一个视图当前是从20度旋转到100度,并且在动画之间的某个地方,一个新的动画被踢,并希望该视图达到15度。使用UIView动画很简单。如何使用CAKeyFrameAnimation?
基本上我希望它的行为类似于UIView动画,它可以获取当前状态;)
CALayer* theLayer = rotatedView.layer;
CAKeyframeAnimation* animation;
animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
animation.duration = 2;
animation.repeatCount = 1;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
animation.values = [NSArray arrayWithObjects:
[NSNumber numberWithFloat:(10.0 / 180.0) * M_PI],
[NSNumber numberWithFloat:(20.0 / 180.0) * M_PI],
[NSNumber numberWithFloat:(30.0 / 180.0) * M_PI], nil];
[theLayer addAnimation:animation forKey:@"transform.rotation.z"];
答案 0 :(得分:1)
您可以使用theLayer.transform
或theLayer.affineTransform
获取当前变换矩阵(在动画之前),然后使用iphone sdk CGAffineTransform getting the angle of rotation of an object来获取角度。
答案 1 :(得分:0)
您可以使用我在this answer中提供的代码获取用于设置动画的起始角度:
CATransform3D rotationTransform = [theLayer transform];
float angle;
if (rotationTransform.m11 < 0.0f)
angle = 180.0f - (asin(rotationTransform.m12) * 180.0f / M_PI);
else
angle = asin(rotationTransform.m12) * 180.0f / M_PI;
或使用更简单的帮助键路径方法suggested here:
float currentAngle = ([[theLayer valueForKeyPath:@"transform.rotation.z"] floatValue] * 180.0f / M_PI);
如果要将此动画添加到正在进行的动画中,则需要直接查询theLayer的presentationLayer的当前角度,而不是theLayer。 CALayer的presentationLayer反映了动画中期动画的当前状态。