【问题标题】:setWantsLayer changes behavior of NSWindowsetWantsLayer 改变 NSWindow 的行为
【发布时间】:2016-09-07 08:11:31
【问题描述】:

我遇到了NSWindow 的问题,它的内容视图 - 标题栏的外观和圆角底角是具体的。我在 10.11 和 10.10 上观察到这个问题,一切看起来都很好。但切中要害。

窗口的标题栏如下所示:

同时底部看起来像这样:

没有圆角。 窗口以编程方式启动,它由两个以编程方式添加的子视图组成,通过使用 self.contentView addSubview: 方法。

经过一些工作发现,添加

[self.contentView setWantsLayer:YES]; 

在窗口初始化的开头,标题栏如下所示:

比正常颜色更深的平面和实心 - 不好。 另一方面,底部看起来像我需要的样子:

我不能显示更多的窗口。 这是我的实验的初始化:

[self.contentView setWantsLayer:YES];

self.identifier = someid;
self.styleMask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask;
self.backingType = NSBackingStoreBuffered;
[self setFrame:NSMakeRect(0, 0, windowInitWidth, windowInitHeight) display:NO];
[self setBackgroundColor:[NSColor colorForKeyPath:@"blackcolor"]];
NSButton *windowButton = [self standardWindowButton:NSWindowCloseButton];
[windowButton setEnabled:NO];
[self centerOnMainWindowScreen];

[self setupLeftPanel];
[self setupRightPanel];
[self setupConstraints];

任何帮助,这将解释为什么会发生这种情况(绘制窗口元素的顺序是什么?)以及如何正确初始化窗口,感谢。 再一次:它在 10.10 上都可以正常工作。 10.11 导致绘图损坏。

【问题讨论】:

  • 我认为标题栏变暗是由背景颜色引起的,而不是由图层引起的。
  • 您是否尝试过不理会内容视图,而是添加一个子视图来填充它并使该层支持?
  • @Sulthan - 我尝试将颜色 ([self setBackgroundColor:]) 更改为黑白而不是设置颜色。当 contentView 不是 layer-backed 时,Bar 是正常的。
  • @KenThomases - 是的,我做到了。我创建了新的 NSView 并将其链接到 contentView (addSubiew)。行为是相同的 - 底部的角不圆 - [intermediatelayer setWantsLayer:YES] 时的黑色标题栏。
  • 你能创建一个Minimum Complete and Verifiable Example 吗?我在我的窗口中尝试了您的代码,但一切正常。标题栏的唯一变化是由背景颜色引起的(黑色背景使整个窗口变暗)。

标签: objective-c cocoa nsview nswindow osx-elcapitan


【解决方案1】:

毕竟,你们是对的。 我无法创建最小的完整且可验证的示例,但我决定将窗口的背景颜色更改为透明颜色。 我不知道为什么它最初设置为灰色(当我收到任务时它是灰色的)但将其更改为透明不会影响以后放置的任何组件。

所以这对我来说是一个解决方案,但我仍然想知道,为什么当窗口的 contentView 支持图层时,标题栏会受到影响。

【讨论】:

    【解决方案2】:

    我没有解决方案,但我可以可靠地重现此问题(最近在 macOS 10.12.2 上),所以不只是你。使用swift保存并运行以下代码:

    import Cocoa
    
    let window = NSWindow()
    window.setContentSize(NSSize(width: 100, height: 100))
    window.center()
    
    let layeredView = NSView(frame: window.contentView!.frame)
    layeredView.autoresizingMask = [.viewWidthSizable, .viewHeightSizable]
    layeredView.wantsLayer = true
    layeredView.layer!.backgroundColor = NSColor.blue.cgColor
    window.contentView!.addSubview(layeredView)
    
    window.makeKeyAndOrderFront(nil)
    
    NSApplication.shared().run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多