使用CoreAnimation和CALayers无法顺利进行一步一步的旋转

时间:2012-12-03 10:22:58

标签: objective-c xcode core-animation calayer

我试图根据时间旋转带有各种子层的CALayer。存在UDP多播接收器,它将接收新的时间码。我通过计时器获取新的时间:

 [NSTimer scheduledTimerWithTimeInterval:0.02f
 target:self
 selector:@selector(fetchNewTimeAndRotate)
 userInfo:nil
 repeats:YES];

应根据时间轮换CALayer。在我的情况下,在1.8秒内旋转一次。实际上我不需要任何动画,我只需要经常设置角度,这样它就会产生实际的动画。

我尝试过以各种方式设置图层旋转:

我试过CATransform3DMakeRotation:

CATransform3D rotation1 = CATransform3DMakeRotation([self DegreesToRadians:newAngle], 0.0f, 0.0f, 1.0f);
self.circleLayer.transform=rotation1

第二次尝试通过动画使用即时旋转:

rotation.fromValue = [NSNumber numberWithFloat:[self DegreesToRadians:oldAngle]];
rotation.toValue = [NSNumber numberWithFloat:[self DegreesToRadians:newAngle]];
rotation.duration = 0.0f;
rotation.repeatCount = 0.0f;
rotation.removedOnCompletion = NO; //also used YES here with no effect
[self.circleLayer addAnimation:rotation forKey:@"transform.rotation.z"];
oldAngle=newAngle;

第3次尝试只是将角度设置为“transform.rotation.z”

[self.circleLayer setValue:[NSNumber numberWithFloat:[self DegreesToRadians:newAngle]] forKeyPath:@"transform.rotation.z"];

所有上述方法都有效,但会导致轮换中的严重卡顿。我曾尝试在抓取和动画长度中使用几种不同的时间。似乎没有什么能摆脱这个问题。 使用自动旋转每0.02和3.6°角是唯一可以为我提供平滑结果的选项。我在这里犯了一个根本性的错误,还是没有理解CoreAnimation的概念?我知道它将用于制作动画本身。但我需要它来对用户输入作出反应并立即进行更改。 我感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

你的意思是CADisplayLink,不是吗?

DisplayLink对象通常用于OpenGL中基于帧的动画,但它们不“使用OpenGL”。创建显示链接并将其附加到应用程序以触发绘图是完全有效的。

正如另一张海报所说,NSTimer不是精确控制动画帧的好选择。如果你编写一个只运行计时器并测量它的程序,它看起来会很好。但是,计时器依赖于您的应用经常访问事件循环。它们不是先发制人的,如果你的应用程序在计时器应该点火时很忙,它将会关闭,甚至错过点火间隔。

如果继续使用显示链接,您可能需要编写代码以检查从最后一帧开始经过的时间,并计算该动画的数量。这样,如果你放弃一个帧,动画仍然以正确的速度前进(如果你丢弃一帧,那么在下一帧之前经过两倍的时间,所以你让你的对象移动两倍。)