0

我正在尝试找出正确的方法来连续为支持图层的 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

仅讨论视图的框架矩形和 alpha 值。所以我不确定如何将它用于 frameRotation

亲切的问候,亚历克

4

1 回答 1

2

简单的答案是你不能使用 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;

}

这得到了很好的结果。

于 2011-09-08T02:02:25.770 回答