10.9中的自定义NSWindow当SetOpaque不显示阴影时:NO

时间:2014-12-18 16:17:57

标签: macos cocoa nswindow

所以我创建了一个NSWindow(带圆角),在10.10中,它周围有一个阴影。然而,当我在10.9中测试时,阴影消失了。我在每个可能的点都设置了断点,[window hasShadow]始终为YES。

如果我在窗口的[self setOpaque:YES]方法中设置initWithContentRect,则阴影会回来。

以前有人见过这个吗?或者知道什么可能导致这种情况?

hasShadow属性似乎没有做任何事情,因为如果我将其设置为YES / NO,它不会改变任何内容。只是将其设置为不透明/透明会使阴影显示/消失

提前致谢!

1 个答案:

答案 0 :(得分:1)

以下是我最终如何处理此问题。

首先,只有在使用分层后视图时才会发生这种情况(如果我们想要轻松实现圆角,这是我们的情况),在RoundTransparentWindow Apple样本中你可以测试它,直到你不要让CutomView分层,你也会在10.9上看到窗口阴影,添加[self setWantsLayer:YES];会杀死你的影子。

此处解决方案的关键是将所有分层视图添加到根本没有图层的视图中,并将该视图添加到窗口contentView。新的contentView应该通过以下方式重新实现drawRect:方法:

- (void)drawRect:(NSRect)dirtyRect
{
    [NSGraphicsContext saveGraphicsState];

    [[NSColor clearColor] set];
    NSRectFill(dirtyRect);

    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds]
                                                     xRadius:cCornerRadius
                                                     yRadius:cCornerRadius];
    [[NSColor whiteColor] set];
    [path fill];

    [NSGraphicsContext restoreGraphicsState];
}

"预绘图"填充任何NONE透明颜色的圆角是这里的关键,即使在窗口构造期间设置[self setOpaque:NO]; self.backgroundColor = [NSColor clearColor];,它也会使窗口服务器再次使用阴影,正如您之前发现的那样,使服务器思考窗口是透明的,不需要阴影。