为啥窗口背景在全屏时保持黑色?

Posted

技术标签:

【中文标题】为啥窗口背景在全屏时保持黑色?【英文标题】:Why does the window background remain black in fullscreen?为什么窗口背景在全屏时保持黑色? 【发布时间】:2015-08-27 13:17:03 【问题描述】:

我创建了一个没有标题的窗口-

 override func windowDidLoad() 
    super.windowDidLoad()
    self.window?.styleMask = NSBorderlessWindowMask 
    self.window?.movableByWindowBackground = true

我已经设置 canBecomeKeyWindow by-

override var canBecomeKeyWindow:Bool

    get
        return true
    


我改变了容器视图的背景颜色-

  override func drawRect(dirtyRect: NSRect) 
    super.drawRect(dirtyRect)

    var viewcolor = NSColor.whiteColor()
    viewcolor.setFill()
    NSRectFill(dirtyRect)



自定义视图作为子视图添加到此容器视图中,我更改了自定义视图的背景颜色-

 override func drawRect(dirtyRect: NSRect) 
    super.drawRect(dirtyRect)

    NSColor(SRGBRed: 0.8, green: 0.26, blue: 0.33, alpha:1.0).set()
    NSRectFill(self.bounds)

现在当我做一个toggleFullscreen之类的-

 @IBAction func goFullScreen(sender: AnyObject) 
    self.view.window?.toggleFullScreen(sender)



屏幕的整个区域没有被填满。创建的窗口后面有空白(黑色)背景。应用程序应填满空间,此截图中不应有黑色背景

如何解决此问题。感谢您的帮助。

【问题讨论】:

如果您不将窗口切换到全屏,您可以将其调整到您想要的大小吗?我的猜测是你有限制窗口大小的约束,或者你设置了窗口的maxSizecontentMaxSize 没有。我没有窗口的最大尺寸或最小尺寸。我还想补充一点,如果我删除“self.window?.styleMask = NSBorderlessWindowMask”行,切换工作正常。但是窗口会有我不想要的标题。 你试过NSBorderlessWindowMask | NSResizableWindowMask吗? 是的!!!。我从过去 2 小时开始拉头发。这非常有效。 @KenThomases,我认为你应该发布你的建议作为答案。所以OP可以接受它。 【参考方案1】:

问题是您的窗口无法调整大小。将styleMask 设置为NSBorderlessWindowMask 无意中删除了NSResizableWindowMask

您应该将styleMask 设置为NSBorderlessWindowMask | NSResizableWindowMask

【讨论】:

【参考方案2】:

dirtyRect 并不总是等于边界。所以,在一个窗口的drawRect 调用NSRectFill(self.bounds) 代替。填充操作不会影响整体绘图性能。

或者您可以在调整大小处理程序中使用setNeedsDisplay 调用将整个窗口矩形标记为脏,并且只能使用脏区域。

如果您意识到可能会出现性能下降的问题,您可以将窗口的内容标记为支持图层并将图层的颜色设置为白色 - 这样会更有效率(如果您在其上执行任何动画,这也是最佳选择看法)。

Apple 在Optimizing View Drawing 主题中描述了更多技术,您可能会觉得有帮助。

【讨论】:

更改为 self.bounds 没有帮助。不过谢谢你的提示。 您是否设置了自动布局约束以在窗口调整大小时对齐子视图? 添加了子视图中的约束。请参阅我上面的评论“我还想补充一点,如果我删除行”self.window?.styleMask = NSBorderlessWindowMask,切换工作正常。但是随后窗口将具有我不想要的标题。">>对此有任何想法吗? 你能提供一些示例项目吗?对我来说,这看起来像是一个 AppKit 错误。 解决了。我需要将掩码修改为 NSBorderlessWindowMask | NSResizableWindowMask..只有 NSBorderlessWindowMask 会导致这个问题。

以上是关于为啥窗口背景在全屏时保持黑色?的主要内容,如果未能解决你的问题,请参考以下文章

状态栏在全屏对话框片段android中将其颜色更改为黑色

防止 MPMoviePlayerController 在全屏时旋转和缩放为纵向

MpMovieplayerController 点击手势识别器在全屏时不会触发

为啥我在使用 ThreeJS 和 VueJS 时只看到黑色背景?

Libgdx 未缩放全屏

创建一个即使在全屏模式下也保持在顶部的新窗口(Linux 上的 Qt)