未来观众:
我已成功地完成这个旋转动画和代码与描述可以在寿的问题被发现。 在NSImage中的NSView转动不灵
你继续请了投票前邓肯ç的答案。 正如我管理实现了从他的回答这个旋转。
我有一个像这样的,
我想保持旋转此同步图标,在不同的线程。 现在,我尝试使用石英作曲家,并添加动画QCView但它具有非常疯狂的效果和速度很慢了。
题 :
如何持续地非常少的加工费用旋转该图像?
功夫
我读CoreAnimation,Quartz2D文档,但我没能找到使它的工作方式。 我知道到目前为止,是唯一的事情,我必须使用
- CALayer的
- CAImageRef
- 的AffineTransform
- NSAnimationContext
现在,我没有料到的代码,但伪代码的理解将是伟大的!
获取某个对象旋转180度以上其实是有点棘手。 问题是,你指定的结束旋转变换矩阵,系统决定在另一个方向旋转。
我所做的就是创建的小于180度,建立了以添加剂的CABasicAnimation,并具有重复计数。 动画中的每个步骤的动画对象的更多。
下面的代码是从iOS应用程序所采取的,但该技术是在Mac OS中是相同的。
CABasicAnimation* rotate = [CABasicAnimation animationWithKeyPath: @"transform.rotation.z"];
rotate.removedOnCompletion = FALSE;
rotate.fillMode = kCAFillModeForwards;
//Do a series of 5 quarter turns for a total of a 1.25 turns
//(2PI is a full turn, so pi/2 is a quarter turn)
[rotate setToValue: [NSNumber numberWithFloat: -M_PI / 2]];
rotate.repeatCount = 11;
rotate.duration = duration/2;
rotate.beginTime = start;
rotate.cumulative = TRUE;
rotate.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
CAAnimation对象上的层进行操作,因此对于Mac OS中,您将需要设置在界面生成器中的“希望层”属性,然后将动画添加到您的视图的层。
为了使您的视图旋转永远,你会设置重复计数像1e100一些非常大的数字。
一旦你创建你的动画,你把它添加到您的视图与代码是这样的层:
[myView.layer addAnimation: rotate forKey: @"rotateAnimation"];
这是对所有有它。
更新:
我最近了解到的另一种方式来处理大于180度,或连续旋转旋转。
有一种称为CAValueFunction特殊的对象,可以让您将更改应用于图层的变换使用任意值,包括指定多个完整的旋转值。
创建图层的变换属性的CABasicAnimation,但随后而不是提供一个转换,您提供的值是一个NSNumber,让新的旋转角度。 如果你提供诸如20pi一个新的角度,您层将旋转10个完整旋转(二皮音乐/旋转)。 代码如下所示:
//Create a CABasicAnimation object to manage our rotation.
CABasicAnimation *rotation = [CABasicAnimation animationWithKeyPath:@"transform"];
rotation.duration = 10.0;
CGFLOAT angle = 20*M_PI;
//Set the ending value of the rotation to the new angle.
rotation.toValue = @(angle);
//Have the rotation use linear timing.
rotation.timingFunction =
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
/*
This is the magic bit. We add a CAValueFunction that tells the CAAnimation we are
modifying the transform's rotation around the Z axis.
Without this, we would supply a transform as the fromValue and toValue, and
for rotations > a half-turn, we could not control the rotation direction.
By using a value function, we can specify arbitrary rotation amounts and
directions and even rotations greater than 360 degrees.
*/
rotation.valueFunction =
[CAValueFunction functionWithName: kCAValueFunctionRotateZ];
/*
Set the layer's transform to it's final state before submitting the animation, so
it is in it's final state once the animation completes.
*/
imageViewToAnimate.layer.transform =
CATransform3DRotate(imageViewToAnimate.layer.transform, angle, 0, 0, 1.0);
[imageViewToAnimate.layer addAnimation:rotation forKey:@"transform.rotation.z"];
(我摘录了上面的代码从一个工作示例应用程序,并拿出一些东西,并没有直接相关的问题。你可以看到在项目中使用此代码KeyframeViewAnimations在github上(链接)。,做旋转代码是在一个称为`handleRotate”方法