我有一个自定义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个像素)。
我是否需要考虑重绘的底栏?
任何和所有帮助都非常感激。
答案 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(特别是“图纸视图内容”部分)