【发布时间】:2011-07-01 21:37:03
【问题描述】:
我有一个NSBox,我在其中绘制小矩形,NSRectFill()。我的代码如下所示:
for (int i = 0; i <= 100; i++){
int x = (rand() % 640) + 20;
int y = (rand() % 315) + 196;
array[i] = NSMakeRect(x, y, 4, 4);
NSRectFill(array[i]);
}
这个 for 循环在网格中创建了 100 个随机放置的矩形。我一直在尝试做的是创建一种动画,由这段代码反复运行,创建一个随机出现的矩形的动画,使用这段代码:
for (int i = 0; i <= 10; i++) {
[self performSelector:@selector(executeFrame) withObject:nil afterDelay:(.05*i)];
}
顺便说一句,第一个 for 循环是 executeFrame 函数中唯一的东西。所以,我需要做的是擦除帧之间的所有矩形,所以它们的数量保持不变,它们看起来像在移动。我尝试通过再次绘制背景来做到这一点,在调用executeFrame 之前调用[myNsBox display];,但这看起来好像没有绘制矩形。之后调用它做了同样的事情,所以切换到setNeedsDisplay 而不是显示。我无法弄清楚这一点,任何帮助将不胜感激。
顺便说一句,另外一件事情是,当我尝试运行我的代码来执行帧时,而不是尝试擦除中间的矩形,所发生的只是又绘制了 100 个矩形。即使我要求抽出 1000 个,或 10,000 个。然后,如果我离开窗口并回到它(立即,时间不是这里的因素),页面更新并且矩形在那里。我试图通过[box setNeedsDisplayInRect:array[i]]; 以一种奇怪的方式来克服这个问题,导致它更新每一帧,但会删除矩形的一部分。对此的任何帮助也将不胜感激。
【问题讨论】:
-
向您的视图发送
display消息是正确的解决方案非常罕见。你通常只需要设置它的needsDisplay并让 AppKit 告诉它在正确的时间绘制 - 并在 AppKit 告诉它时完成所有视图的绘制,而不是在任何其他时间。
标签: objective-c cocoa drawing