setNeedsDisplay *总是*重绘吗?

时间:2011-09-06 16:54:44

标签: objective-c cocoa-touch cocoa custom-view setneedsdisplay

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

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

[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:方法。正如我所说,在可可之下它起作用了。

2 个答案:

答案 0 :(得分:3)

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

  

您可以使用此方法通知系统您的视图内容   需要重新绘制。此方法记录了请求和   立即将控制权返回给您的代码。视图不是   实际重绘直到下一个绘图周期,此时全部   无效的视图已更新。

     

您应该使用此方法请求仅在重定时重绘视图   视图的内容或外观发生变化。如果你只是改变了   视图的几何体,视图通常不会重绘。相反,它   现有内容根据视图中的值进行调整   contentMode财产。重新显示现有内容的改进   通过避免重绘没有的内容的需要来实现性能   改变。

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

  

每当用于绘制视图对象的数据或状态发生变化时,   视图应发送setNeedsDisplay:消息。标记了NSView个对象   因为需要显示会在每次传递时自动重新显示   应用程序的事件循环。 (查看需要重新显示的对象   在事件循环到来之前,当然可以立即发送   适当的显示...方法。)

答案 1 :(得分:3)

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

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

仅仅因为你每隔30毫秒标记一次视图是脏的并不意味着每隔30毫秒会画一次。它通常应该(大约30fps),但没有保证。 drawRect:不应该依赖于它的调用频率。从你的问题来看,我认为你的意思是它永远不会画画,而不是像往常那样经常画画。