objective-c – 如何在NSImageView内部实现NSImage的连续旋转?

未来观点:

我已经设法完成这个旋转动画和代码与描述可以在tho问题找到. NSImage rotation in NSView is not working

在你继续之前,请提出Duncan C的答案.当我从他的答案中实现这个轮换时.

我有这样的形象,

我想继续旋转这个同步图标,在不同的线程上.现在我尝试使用Quartz作曲家,并将动画添加到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"];

这就是它所有的一切.

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...