这是一个NSView子类,只是在它的界限中绘制一个微妙的蓝色渐变(在这张图片中很难看到,但它就在那里)。在视图中我放置了一个NSTextField并将单元格设置为具有NSBackgroundStyleRaised。人工制品是文本字段的背景,其外观与其超视图的颜色相同。在这种情况下,superview绘制渐变的东西看起来很奇怪。
蓝色视图的-drawRect:
是
- (void)drawRect:(NSRect)dirtyRect
{
[super drawRect:dirtyRect];
// Base colours
baseColor = [NSColor colorWithCalibratedRed: 0.271 green: 0.578 blue: 0.874 alpha: 1];
baseColorDarkened = [NSColor colorWithCalibratedRed: 0.159 green: 0.491 blue: 0.911 alpha: 1];
// Draw gradient
NSGradient* gradient = [[NSGradient alloc] initWithStartingColor:baseColor endingColor:baseColorDarkened];
NSBezierPath* rectanglePath = [NSBezierPath bezierPathWithRect:dirtyRect];
[gradient drawInBezierPath: rectanglePath angle: 90];
// Draw thin border
NSBezierPath *border = [NSBezierPath bezierPath];
[[baseColorDarkened blendedColorWithFraction:0.2 ofColor:[NSColor blackColor]] set];
[border setLineWidth:1];
[border stroke];
}
我正在使用基于文档的应用程序,所以在-windowControllerDidLoadNib:
我设置了文本字段的属性,
- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
[super windowControllerDidLoadNib:aController];
[[_label1 cell] setBackgroundStyle:NSBackgroundStyleLowered];
[_label1 setBackgroundColor:[NSColor clearColor]]; // <-- Doesn't help :(
}
答案 0 :(得分:2)
某些背景样式似乎需要特殊的合成(可能是由于阴影?)
OS X使用缓存的&amp;绘制NSTextField
时超级视图背景的缩放表示
我使用了您的绘图代码但更改了顶部颜色以使缓存的绘图更加明显:
我找到了2个解决方法:
NSWindowDelegate
方法windowDidUpdate:
第二种方法虽然有点讨厌:
- (void)windowDidUpdate:(NSNotification*)notification
{
[self.label.superview setNeedsDisplay:YES];
}
结果: