自定义NSView填充底部栏上的油漆

时间:2010-03-05 18:01:02

标签: objective-c cocoa nsview

我有一个自定义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时我的NSView似乎映射到父窗口而不是自定义setNeedsDisplay,但是当我调用时,我的{{1}}正确调整使用鼠标调整窗口大小(即使只有1个像素)。

我是否需要考虑重绘的底栏?

任何和所有帮助都非常感激。

1 个答案:

答案 0 :(得分:2)

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

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

然后在另一种方法中,只需调用dirtyRect,然后会自动调用[self setNeedsDisplay:YES];来重绘视图。

有关详细信息,请参阅此处:http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CocoaViewsGuide/SubclassingNSView/SubclassingNSView.html#//apple_ref/doc/uid/TP40002978-CH7-SW4(特别是“图纸视图内容”部分)