NSWindow Shadow Outline
我正在通过为窗口设置自定义内容视图来绘制自定义窗口。绘制自定义视图时,我给它加上圆角和漂亮的轮廓以模仿适当的窗口。
但是,我在窗口周围看到了另一个1 px的轮廓,该轮廓从角落的边缘偏离。我发现,如果我关闭阴影,它就会消失,但是很明显,因为它想像窗户一样工作,所以我需要阴影。这是我关于1px轮廓线的意思:
如何防止这种情况?
编辑
用于绘制自定义窗口的内容视图的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 2 3 4 5 6 7 8 9 | @implementation NSWindow(NoShadowRim) - (id)_shadowRimInfo { return @{ @"kCUIMeasureWindowFrameRimDensity": [NSNumber numberWithInt:0] }; } @end |
免责声明:这将覆盖
尝试:
1 2 3 | [[self window] display]; [[self window] setHasShadow:NO]; [[self window] setHasShadow:YES]; |
您需要通过发送
据我正确理解,阴影是由Windows服务器绘制的。当您绘制带有圆角或其他非矩形形状的自定义NSWindow时,窗口服务器不会计算这些透明像素,也不会在其下方放置阴影。
我开发了一些技巧来避免这种行为。只需在路径下放置其他阴影即可,如下所示:
1 2 3 4 5 6 7 8 | 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]; |
理想情况下,为获得完美效果,我认为阴影必须等于窗口服务器。
自动绘制轮廓窗口区域的线条。我有一个窗口,该窗口的这条线在下圆角处准确运行。您必须将窗口设置为不透明,并且将背景色设置为透明:
1 2 | [self setOpaque:NO]; [self setBackgroundColor:[NSColor clearColor]]; |
contentView -drawRect中的某处:您要做的
1 2 3 4 | [NSGraphicsContext saveGraphicsState]; [pathWithBottomRoundedCorner addClip]; // your drawing here... [NSGraphicsContext restoreGraphicsState]; |
应该可以。