如何解决NSWindow阴影轮廓
| 我通过为窗口设置自定义内容视图来绘制自定义窗口。当我绘制自定义视图时,我给它加上圆角和漂亮的轮廓以模仿适当的窗口。 但是,我在窗口周围看到另一个1 px的轮廓,该轮廓从拐角处的边缘偏离。我发现,如果我关闭阴影,它就会消失,但是很明显,因为它想像窗户一样工作,所以我需要阴影。这是关于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];
解决方法
不要问我我是怎么得到的,但这将解决您的问题。
为“ 1”定义一个类别,其内容如下:
@implementation NSWindow(NoShadowRim)
- (id)_shadowRimInfo {
return @{
@\"kCUIMeasureWindowFrameRimDensity\": [NSNumber numberWithInt:0]
};
}
@end
免责声明:此方法将覆盖NSWindow
的内部方法,因此使用此方法时,后果自负。它可能随任何OS X更新而中断。
, 您需要通过发送-invalidateShadow
来告诉窗口重新计算其阴影。
, 尝试:
[[self window] display];
[[self window] setHasShadow:NO];
[[self window] setHasShadow:YES];
, 这条轮廓窗口区域的线会自动绘制。我有一个窗口,该线在下圆角处准确运行。您必须将窗口设置为不透明,并且将背景色设置为透明:
[self setOpaque:NO];
[self setBackgroundColor:[NSColor clearColor]];
contentView -drawRect中的某处:
[NSGraphicsContext saveGraphicsState];
[pathWithBottomRoundedCorner addClip];
// your drawing here...
[NSGraphicsContext restoreGraphicsState];
那应该工作。
, 据我正确理解,阴影是由Windows Server绘制的。当您绘制带有圆角或其他非矩形形状的自定义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];
理想情况下,为获得完美效果,我认为阴影必须等于窗口服务器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。