1

当我使用 GLUT 时,我可以提供一个回调函数,该函数每帧调用一次以生成或动画帧内容。

我如何对 Cocoa 做同样的事情?

我知道有 setNeedsDisplay,但我不知道如何避免每帧多次调用它。我需要的是一个事件或其他回调来告诉我何时绘制另一帧。

4

1 回答 1

3

Cocoa 中的所有内容都是缓冲的,因此您可以移动、动画和调整视图而无需重绘它们。如果您需要一遍又一遍地重绘视图(例如,重复调用 drawRect: 并创建自己的动画),您需要创建一个每 1/20 秒触发一次并触发视图刷新的计时器。

您可以像这样创建一个计时器:

[NSTimer scheduledTimerWithTimeInterval:1.0/20.0 target:self selector:@selector(animate) userInfo:nil repeats:YES];

您的回调函数(在本例中为“动画”)看起来像这样。如果你的动画需要业务逻辑,你应该把它放在这里。不过,所有绘图都需要在视图的 drawRect 函数中完成。

- (void)animate {
    [animatedView setNeedsDisplay: YES];
} 

每帧多次调用 setNeedsDisplay 是安全的。SetNeedsDisplay 在视图上设置一个标志,实际上并不执行任何绘图。当您的代码已执行并且应用程序返回到主运行循环时,所有带有 setNeedsDisplay=YES 的视图都将被重绘。

希望有帮助!

于 2009-06-27T18:50:31.753 回答