如何在NSImageView中实现NSImage的连续旋转?

Tea*_*App 9 macos cocoa core-animation objective-c quartz-2d

未来观众:

我已经设法完成了这个旋转动画,并且可以在问题上找到描述代码.NSView中的NSImage旋转无效

在你继续之前,请投票给Duncan C的答案.因为我设法从他的回答中实现这一轮换.


我有这样的图像,

在此输入图像描述

我想继续旋转此同步图标,在另一个线程上.现在我尝试使用Quartz编辑器并将动画添加到QCView,但它具有非常疯狂的效果,也非常慢.

题 :

如何以极低的处理费用连续旋转此图像?

功夫

我阅读了CoreAnimation,Quartz2D文档,但我找不到让它工作的方法.到目前为止我唯一知道的是,我必须使用

  • CALayer的
  • CAImageRef
  • 的AffineTransform
  • NSAnimationContext

现在,我不期待代码,但使用伪代码的理解将是伟大的!

Dun*_*n C 15

让物体旋转超过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];
Run Code Online (Sandbox Code Playgroud)

CAAnimation对象在图层上运行,因此对于Mac OS,您需要在界面构建器中设置"想要图层"属性,然后将动画添加到视图的图层.

要使视图永远旋转,您需要将重复次数设置为一些非常大的数字,例如1e100.

创建动画后,您可以使用以下代码将其添加到视图的图层:

[myView.layer addAnimation: rotate forKey: @"rotateAnimation"];
Run Code Online (Sandbox Code Playgroud)

这就是它的全部内容.