我通过为窗口设置自定义内容视图来绘制自定义窗口。当我绘制自定义视图时,我给它圆角和一个漂亮的轮廓来模仿一个合适的窗口。
但是,我看到窗户周围还有另一个1像素的轮廓,它从角落的边缘偏离。我发现,如果我关掉阴影就会消失,但很明显,因为这需要像窗户一样,我需要阴影。这就是我对1px大纲的意思:
我该如何防止这种情况?
修改
绘制自定义窗口内容视图的代码:
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];
答案 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];
理想情况下,对于完美的结果,我的影子必须等于窗口服务器。