NSWindow Shadow Outline

时间:2011-05-29 12:23:15

标签: objective-c cocoa macos nswindow shadow

我通过为窗口设置自定义内容视图来绘制自定义窗口。当我绘制自定义视图时,我给它圆角和一个漂亮的轮廓来模仿一个合适的窗口。

但是,我看到窗户周围还有另一个1像素的轮廓,它从角落的边缘偏离。我发现,如果我关掉阴影就会消失,但很明显,因为这需要像窗户一样,我需要阴影。这就是我对1px大纲的意思:

enter image description here

我该如何防止这种情况?


修改

绘制自定义窗口内容视图的代码:

    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] cornerRadius:5];

    NSGradient* aGradient = [[[NSGradient alloc] initWithColorsAndLocations:
                              [NSColor colorWithDeviceRed:0.5569 green:0.5137 blue:0.4588 alpha:1.0000], 0.0,
                              [NSColor colorWithDeviceRed:0.5569 green:0.5137 blue:0.4588 alpha:1.0000], 1.0,
                              nil] autorelease];

    [aGradient drawInBezierPath:path angle:90];

    [path setLineWidth:4];
    [[NSColor colorWithDeviceRed:0.4235 green:0.3922 blue:0.3451 alpha:0.9000] setStroke];
    [path strokeInside];

    [path setLineWidth:3];
    [[NSColor colorWithDeviceRed:0.8431 green:0.8314 blue:0.8078 alpha:1.0000] setStroke];
    [path strokeInside];

    [path setLineWidth:1];
    [[NSColor colorWithDeviceRed:0.4235 green:0.3922 blue:0.3451 alpha:0.9000] setStroke];
    [path strokeInside];

5 个答案:

答案 0 :(得分:3)

不要问我是怎么做到这一点的,但这样可以解决你的问题。

使用以下内容定义NSWindow的类别:

@implementation NSWindow(NoShadowRim)

- (id)_shadowRimInfo {
  return @{
    @"kCUIMeasureWindowFrameRimDensity": [NSNumber numberWithInt:0]
  };
}

@end

免责声明:这会覆盖NSWindow的内部方法,因此使用它需要您自担风险。它可能会破坏任何OS X更新。

答案 1 :(得分:1)

您需要通过发送-invalidateShadow告诉窗口重新计算其阴影。

答案 2 :(得分:1)

尝试:

[[self window] display];
[[self window] setHasShadow:NO];
[[self window] setHasShadow:YES];

答案 3 :(得分:0)

自动绘制该窗口区域的轮廓线。我有一个窗口,这条线在底部圆角周围精确地运行。您必须将窗口设置为非透明,背景颜色为透明:

  [self setOpaque:NO];
  [self setBackgroundColor:[NSColor clearColor]];

contentView -drawRect中的某个地方:你做

  [NSGraphicsContext saveGraphicsState];
  [pathWithBottomRoundedCorner addClip];
  // your drawing here...
  [NSGraphicsContext restoreGraphicsState];

这应该有效。

答案 4 :(得分:0)

据我所知,Windows服务器绘制阴影。当您使用圆角或其他非矩形形状绘制自定义NSWindow时,窗口服务器不会计算这些透明像素,也不会在它们下面留下阴影。

我开发了一些黑客来避免这种行为。只需在你的路径下放下额外的阴影,如下所示:

NSShadow *headShadow = [[NSShadow alloc] init];
[headShadow setShadowColor:[NSColor colorWithSRGBRed:0.0 
                                               green:0.0 
                                                blue:0.0 
                                               alpha:0.16]];
[headShadow setShadowBlurRadius:0.0f];
[headShadow setShadowOffset:NSMakeSize(0.0f, 0.0f)];
[headShadow set];

理想情况下,对于完美的结果,我的影子必须等于窗口服务器。