父视图绘制渐变时,使用NSBackgroundStyleRaised文本字段绘制工件

时间:2014-02-03 04:58:40

标签: macos cocoa nstextfield

这是一个NSView子类,只是在它的界限中绘制一个微妙的蓝色渐变(在这张图片中很难看到,但它就在那里)。在视图中我放置了一个NSTextField并将单元格设置为具有NSBackgroundStyleRaised。人工制品是文本字段的背景,其外观与其超视图的颜色相同。在这种情况下,superview绘制渐变的东西看起来很奇怪。

View with gradient.

蓝色视图的-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 :(
}

1 个答案:

答案 0 :(得分:2)

某些背景样式似乎需要特殊的合成(可能是由于阴影?) OS X使用缓存的&amp;绘制NSTextField时超级视图背景的缩放表示 我使用了您的绘图代码但更改了顶部颜色以使缓存的绘图更加明显:

enter image description here

我找到了2个解决方法:

  • 只需在标签的超级视图上启用图层支持。
  • 如果无法启用图层支持,则可以强制重新显示标签的超级视图。例如在NSWindowDelegate方法windowDidUpdate:

第二种方法虽然有点讨厌:

- (void)windowDidUpdate:(NSNotification*)notification
{
   [self.label.superview setNeedsDisplay:YES];
}

结果:

enter image description here