使用NSViewAnimation连续动画frameRotation

时间:2011-09-05 08:28:56

标签: nsviewanimation

我正在试图找出正确的方法来连续动画图层支持的NSView的frameRotation。

特别是,我基本上试图在您单击并按住图标时重新创建新Launchpad的动画效果。事件处理不是问题,它是实际的重复动画。

到目前为止,我已经使用NSTimer使用视图的动画代理来回动画frameRotation。虽然这有效,但它似乎是资源密集型的,我确信NSAnimation可以用于此。

我只是想知道是否有人可以在这里指出我正确的方向。

编辑:此文档在此处:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/AnimationGuide/Articles/ViewAnimations.html#//apple_ref/doc/uid/TP40003593-DontLinkElementID_7

仅讨论视图的frame rect和alpha值。所以我不确定如何将它用于frameRotation

亲切的问候, 艾力

1 个答案:

答案 0 :(得分:1)

简单的答案是你无法使用NSViewAnimation,但你可以使用CABasicAnimation。

以下是我提出的建议:

将此动画添加到视图的图层:

- (CABasicAnimation *)rockingAnimation {

float diff = 0.065 - .055;
float startValue = (((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) + 0.055;
float endValue = (((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) - 0.055;
float duration = (((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) + 0.085;

CABasicAnimation *rockAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
[rockAnimation setFromValue:[NSNumber numberWithFloat:startValue]];
[rockAnimation setToValue:[NSNumber numberWithFloat:endValue]];
[rockAnimation setDuration:duration];
[rockAnimation setRemovedOnCompletion:YES];
[rockAnimation setFillMode:kCAFillModeForwards];
[rockAnimation setAutoreverses:YES];
[rockAnimation setRepeatCount:10000];

return rockAnimation;

}

这得到了相当不错的结果。