【问题标题】:Custom NSWindow in 10.9 Doesn't show shadow when SetOpaque:NO10.9 中的自定义 NSWindow 在 SetOpaque:NO 时不显示阴影
【发布时间】:2015-02-17 12:09:42
【问题描述】:

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

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

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

看起来hasShadow 属性没有做任何事情,因为如果我将它设置为YES/NO 它不会改变任何东西。只需将其设置为不透明/透明即可使阴影出现/消失

提前致谢!

【问题讨论】:

  • 一些进展,发现如果我在窗口上设置Opaque:NO,它不会产生阴影,因为它认为背景是透明的。这是我的内容视图在 10.9 中没有产生阴影的问题

标签: macos cocoa nswindow


【解决方案1】:

这就是我最终解决这个问题的方法。

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

这里解决方案的关键是将所有分层视图添加到一个根本没有层的视图中,并将该视图添加到窗口内容视图中。新的 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];,它也会使窗口服务器再次使用阴影,正如你之前发现的那样,让服务器认为窗口是透明的,不需要阴影。

【讨论】:

  • 还有一个问题,不幸的是这个阴影将是未聚焦的窗口阴影like mentioned here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多