0

我使用 cocoa 编写了一个小的自定义视图应用程序。后来(是的,我知道这很糟糕)我只是问自己:这也适用于可可粉吗?当然 id 并没有立即起作用,我不得不更改类名等等。好吧,我在需要时使用NSTimersetNeedsDisplay:方法刷新了视图。在可可下工作得很好,但绝对不是在可可触摸下。

我无法向自己解释,我实际上不知道哪些代码行可以帮助某人解决问题。也许这里是计时器:

[self setMyTimer: [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(myTarget:) userInfo:nil repeats:YES]];

它的目标:

- (void) myTarget:(NSTimer *)timer {
    [self setNeedsDisplay];
}

计时器每 30 毫秒调用一次,我使用 NSLog 进行了检查。

在这个drawRect:方法中,我实际上只是画了一些形状,没有做任何其他事情。以防万一有必要调用某种clearRect:方法。正如我所说,在可可下它起作用了。

4

2 回答 2

3

以下是文档中关于setNeedsDisplay(注意缺少参数)的讨论UIView

您可以使用此方法通知系统您的视图内容需要重绘。此方法记录请求并立即将控制权返回给您的代码。直到下一个绘图周期才真正重绘视图,此时所有无效的视图都将更新。

您应该使用此方法请求仅在视图的内容或外观发生变化时重绘视图。如果您只是更改视图的几何形状,通常不会重绘视图。contentMode相反,它的现有内容会根据视图属性中的值进行调整 。重新显示现有内容可避免重绘未更改的内容,从而提高性能。

相比之下,这里是关于setNeedsDisplay:(注意论点)的文档中的讨论NSView

每当用于绘制视图对象的数据或状态发生变化时,都应向视图发送setNeedsDisplay:消息。NSView标记为需要显示的对象会在每次通过应用程序的事件循环时自动重新显示。(当然,在事件循环出现之前需要重新显示的视图对象可以立即发送适当的 display... 方法。)

于 2011-09-06T17:10:22.767 回答
3

我将首先drawRect:使用断点或日志语句来验证是否正在运行。

然后,确保您的视图实际上在屏幕上。的价值是[self superview]多少?您还应该执行类似的操作self.backgroundColor = [UIColor redColor];,以便您可以看到您的视图在哪里。

仅仅因为您每 30 毫秒将视图标记为脏并不意味着它将每 30 毫秒绘制一次。它通常应该(大约 30fps),但不能保证。drawRect:不应该依赖于它被调用的频率。根据您的问题,我假设您的意思是它从不绘画,而不仅仅是没有像预期的那样经常绘画。

于 2011-09-06T17:25:14.360 回答