0

我目前正在开展一个项目,我们正在实施一些核心动画来调整/移动元素的大小。我们注意到,在许多 Mac 上,这些动画的帧速率显着下降,尽管它们相当简单。这是一个例子:

 // Set some additional attributes for the animation.
    [theAnim setDuration:0.25];    // Time
    [theAnim setFrameRate:0.0];
    [theAnim setAnimationCurve:NSAnimationEaseInOut];

    // Run the animation.
    [theAnim startAnimation];
    [self performSelector:@selector(endAnimation) withObject:self afterDelay:0.25];

是否明确说明帧速率(比如 60.0,而不是将其保留为 0.0)将更多优先级放在线程等上,因此可能会提高帧速率?有没有更好的方法来制作这些动画?

4

1 回答 1

6

NSAnimation 的文档

0.0 的帧率意味着尽可能快地进行......帧率并不能保证

合理地,尽可能快的速度应该与 60 fps 相同。


使用核心动画而不是 NSAnimation

NSAnimation 并不是核心动画的一部分(它是 AppKit 的一部分)。我会建议尝试使用 Core Animation 来代替动画。

  1. 将 QuartzCore.framework 添加到您的项目中
  2. 在您的文件中导入
  3. 在您正在制作动画的视图上设置- (void)setWantsLayer:(BOOL)flag为 YES
  4. 切换到动画的核心动画,例如

从上面动画的持续时间来看,“隐式动画”(仅更改图层的属性)可能最适合您。但是,如果您想要更多控制权,则可以使用显式动画,如下所示:

CABasicAnimation * moveAnimation = [CABasicAnimation animationWithKeyPath:@"frame"];
[moveAnimation setDuration:0.25];
// There is no frame rate in Core Animation
[moveAnimation setTimingFunction:[CAMediaTimingFunction funtionWithName: kCAMediaTimingFunctionEaseInEaseOut]];
[moveAnimation setFromValue:[NSValue valueWithCGRect:yourOldFrame]]
[moveAnimation setToValue:[NSValue valueWithCGRect:yourNewFrame]];

// To do stuff when the animation finishes, become the delegate (there is no protocol)
[moveAnimation setDelegate:self];

// Core Animation only animates (not changes the value so it needs to be set as well)
[theViewYouAreAnimating setFrame:yourNewFrame];

// Add the animation to the layer that you
[[theViewYouAreAnimating layer] addAnimation:moveAnimation forKey:@"myMoveAnimation"];

然后在你实现的回调中

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)isFinished {
    // Check the animation and perform whatever you want here
    // if isFinished then the animation completed, otherwise it 
    // was cancelled.
}
于 2012-05-11T20:05:23.530 回答