2012-09-25 42 views
5

在Cocoa中,当我们想要重绘一个视图时,我们会发送一个setNeedsDisplay:消息来告诉视图重新绘制一个参数为YES的视图。我想知道是否有任何情况下您想要发送视图setNeedsDisplay:NO(如多线程环境),并且如果发送视图setNeedsDisplay:YES,然后在setNeedsDisplay:NO之后立即再次设置视图会使视图重绘本身。如果没有理由致电setNeedsDisplay:NO,那么为什么要创建这样一个繁琐的方法,他们可以在那里实现类似[view redrawView]setNeedsDisplay:没有任何用处?

回答

1

setNeedsDisplay:NO可用于您想放弃之前称为setNeedsDisplay:YES的情况。例如。有时候将所有子视图标记为需要显示然后运行一个算法来取消其中的一些标记会更容易。

-2

正如您所知,显示更新在每次通过普通事件时都是自动的(如果需要)循环。如果需要,您可以拨打setNeedsDisplay:以强制显示更新。

NSView文档:

讨论
每当用于绘制视图对象的数据改变或状态,该视图应被发送一个setNeedsDisplay:消息。标记为需要显示的NSView对象在每次通过应用程序的事件循环时自动重新显示。 (需要重新显示事件循环恶有恶报前先查看对象当然可以立即被送到适当的显示...方法。)

这个函数的布尔参数只是指定是否 整个边界的有问题的视图是否受到影响,如果某些属性“needsDisplay”设置为true或false,则不行。因此, setNeedsDisplay:确实的工作几乎就像一个“redrawView”,只有额外的参数。

编辑

以上是从同一文档的启发:

标志
如果YES,标志着接收机的整个边界为需要显示;如果否,标记为不需要显示。

+3

这在很大程度上是不正确的。事件循环检查是否需要重绘视图,如'setNeedsDisplay:'被调用(它确实设置了一个标志:' - [NSView needsDisplay]')。该方法绝对不会导致立即重绘,也不一定每次都会重绘每个视图。您提到的强制绘制行为由' - [NSView display]'和' - [NSView displayRect:]'提供。见http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaViewsGuide/Optimizing/Optimizing.html#//apple_ref/doc/uid/TP40002978-CH11-112409 –

+0

不够公平。我编辑了我的答案并解释了信息的来源。 – Mundi

+1

@Mundi不幸的是,这并不完全回答我的问题。我问是否有任何用于'setNeedsDisplay:NO'的用法。 – TheAmateurProgrammer