【发布时间】:2012-02-05 12:15:57
【问题描述】:
我有一个相对简单的 Cocoa on Mac OS X 10.6 问题要问。我有一个主要的NSView(实际上是ScreensaverView),它没有层支持,并且在其他方面不起眼。它通过NSRectFill 和NSBezierPath:stroke 调用(基本上是点和线)在其drawRect 中进行一些基本绘图。
我还有一个NSView 派生的子类,它充当子视图。我这样做的目的是在子视图中绘制简单的线条,这些线条绘制在主视图中绘制的任何内容之上,但随后可以以某种方式“擦除”以显示任何被遮挡的线条。这个子视图的代码很简单:
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
- (void)dealloc
{
[super dealloc];
}
- (void)drawRect:(NSRect)dirtyRect {
// Transparent background
[[NSColor clearColor] set];
NSRectFillUsingOperation(dirtyRect, NSCompositeCopy);
// If needed for this update, draw line
if (drawLine) {
// OMITTED: Code that sets opaque NSColor and draws a line using NSBezierPath:stroke
}
// If needed for this update, "erase" line
if (eraseLine) {
[[NSColor blackColor] set]; // clearColor?
// OMITTED: Code that draws the same line using NSBezierPath:stroke
}
}
使用如上所示的代码,每次绘制子视图时,主视图都会变黑,而您只能看到子视图行。当子视图没有更新时,主视图内容再次出现。
我尝试过的事情,结果各不相同:
我尝试让子视图从覆盖的
isOpaque返回YES(我意识到这并不正确)。当我这样做时,两个视图都会在子视图更新期间正确绘制,但是子视图线会覆盖它所绘制的任何内容(好的),然后在擦除时,也会在它所在的位置留下一条大黑线(我试图避免的)。尝试使用clearColor而不是blackColor来“擦除”该行会导致该行保留在屏幕上。我尝试通过在
init中调用[self setWantsLayer:YES]来制作两个(和/或只是子视图)图层支持的视图,这会导致完全黑屏。
我觉得我错过了一些非常基本的东西,但无论出于何种原因,我似乎无法弄清楚。非常感谢任何和所有建议。
【问题讨论】: