如何实现内部NSImageView的NSImage中的连续旋转?(How do I achieve

2019-07-29 16:08发布

未来观众:

我已成功地完成这个旋转动画和代码与描述可以在寿的问题被发现。 在NSImage中的NSView转动不灵

你继续请了投票前邓肯ç的答案。 正如我管理实现了从他的回答这个旋转。


我有一个像这样的,

我想保持旋转此同步图标,在不同的线程。 现在,我尝试使用石英作曲家,并添加动画QCView但它具有非常疯狂的效果和速度很慢了。

题 :

如何持续地非常少的加工费用旋转该图像?

功夫

我读CoreAnimation,Quartz2D文档,但我没能找到使它的工作方式。 我知道到目前为止,是唯一的事情,我必须使用

  • CALayer的
  • CAImageRef
  • 的AffineTransform
  • NSAnimationContext

现在,我没有料到的代码,但伪代码的理解将是伟大的!

Answer 1:

获取某个对象旋转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"];

这是对所有有它。



Answer 2:

更新:

我最近了解到的另一种方式来处理大于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”方法



文章来源: How do I achieve continuous rotation of an NSImage inside NSImageView?