1

我有一个窗口,它有一个自定义窗口,NSView并且有一个带有控件的底栏,其中一个是NSColorWheel.

为简单起见,Window 为 332px 高,自定义 NSView 为 300px 高,底部栏为 32px 高。

awakeFromNib当应用程序使用以下代码加载窗口时,底部栏是我的一部分:

[[self window] setAutorecalculatesContentBorderThickness:YES forEdge:NSMinYEdge];
[[self window] setContentBorderThickness: 32.0 forEdge: NSMinYEdge];

在我的自定义NSView类中,我用颜色填充矩形。NSView当应用程序在我的课堂上使用以下内容加载时,一切正常:

- (void)drawRect:(NSRect)dirtyRect
{
    dirtyRect = [self bounds];

    NSColor * mNewColor = [NSColor blackColor];
    [mNewColor set];
    [NSBezierPath fillRect:dirtyRect];
}

但是,如果我随后在底部栏中的色轮更改时调用更改自定义颜色的方法NSView,则底部栏将被颜色覆盖。以下代码说明了此方法(此代码在自定义NSView类中:

- (void)changeBackgroundColor:(NSNotification *)notification
{
    NSLog(@"Changed background color");

    NSRect mRect = [self bounds];
    NSColor * mNewColor = [theColorWell color];
    [mNewColor set];
    [NSBezierPath fillRect:mRect];
    [self setNeedsDisplay:YES];
}

调整窗口大小会立即纠正问题,但显然我不希望用户必须调整窗口大小来解决明显的错误!

我不明白为什么我在调用时bounds似乎映射到父窗口而不是自定义窗口,但是当我使用鼠标调整窗口大小时边界正确调整(即使只有 1 个像素)。NSViewsetNeedsDisplay

我是否需要以某种方式考虑重绘的底部栏?

非常感谢任何和所有帮助。

4

1 回答 1

2

您应该drawRect:使用您的自定义方法完成所有绘图NSView。Cocoa 在调用此方法时会自动为您设置图形上下文 - 如果您在其他方法中执行绘图操作,则可能无法正确绘制。

您的代码drawRect:可以将颜色设置为您指定的当前背景颜色,NSColorWell并用它填充dirtyRect矩形。

然后在其他方法中调用[self setNeedsDisplay:YES];,然后drawRect:会自动调用重绘视图。

请参阅此处了解更多信息:http: //developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CocoaViewsGuide/SubclassingNSView/SubclassingNSView.html#//apple_ref/doc/uid/TP40002978-CH7-SW4(特别是图纸视图内容部分)

于 2010-03-05T18:12:27.637 回答