如何使用 CAKeyFrameAnimation 继续旋转视图?
Posted
技术标签:
【中文标题】如何使用 CAKeyFrameAnimation 继续旋转视图?【英文标题】:How to keep on rotating a view with a CAKeyFrameAnimation? 【发布时间】:2010-02-02 15:10:51 【问题描述】:我尝试这样做:有一个视图已经旋转到某个值,比如说 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"];
【问题讨论】:
【参考方案1】:您可以使用theLayer.transform
或theLayer.affineTransform
获取当前的变换矩阵(动画之前),然后使用iphone sdk CGAffineTransform getting the angle of rotation of an object 获取开始的角度。
【讨论】:
【参考方案2】:您可以使用我在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 反映了动画中间层的当前状态。
【讨论】:
以上是关于如何使用 CAKeyFrameAnimation 继续旋转视图?的主要内容,如果未能解决你的问题,请参考以下文章
CAKeyframeAnimation 完成时如何指定选择器?
如何在 Iphone 中停止 CAKeyFrameAnimation
如何同步几个不同图层的 CAKeyframeAnimation 动画?
如何获取CAKeyframeAnimation对象的当前屏幕xy位置?