首页 > 解决方案 > 初学者遇到了 NSScreen.screens 的问题

问题描述

我是 swift 的初学者,我正在为自己的项目学习。现在,我正在尝试制作一个“信息亭模式”窗口,该窗口最大化以填充整个屏幕,同时隐藏菜单栏和停靠栏,因此无法退出应用程序(顺便说一下,这是一个拖延应用程序)。但是,在一切正常之后,我遇到了一个问题,因为菜单栏占用的空间现在有一个我需要填补的空白(见图)。由于这个差距,用户可以点击差距并退出我试图阻止的应用程序。我在这里做了很多搜索,但我找不到解决方案,我非常感谢我能得到的任何帮助。

注意:我正在使用 Swift 4.1 和 Xcode 9.4.1

import Cocoa

typealias NSRect = CGRect

class MainWindowController: NSWindowController {

    convenience init() {

        self.init(windowNibName: NSNib.Name(rawValue: "MainWindowController"))

    }

    override func windowDidLoad() {

        super.windowDidLoad()

        NSMenu.setMenuBarVisible(false)

        NSApp.presentationOptions = [.hideDock, .hideMenuBar, .disableForceQuit, .disableProcessSwitching,.autoHideToolbar]

        window?.backgroundColor = NSColor(red: 1, green: 0, blue: 0, alpha: 0.754)

        window?.isOpaque = false

        window?.setFrame(NSScreen.screens[0].frame, display: true, animate: false)

        window?.styleMask.remove(.titled)

    }

}

标签: swiftmacoscocoaswift4

解决方案


windowDidLoad 函数的改进版本如下所示:

override func windowDidLoad() {
        
        super.windowDidLoad()
        
        NSMenu.setMenuBarVisible(false)
        NSApp.presentationOptions = [.hideDock, .hideMenuBar, .disableForceQuit, .disableProcessSwitching]
        window?.backgroundColor = NSColor(red: 1, green: 0, blue: 0, alpha: 0.754)
        window?.isOpaque = false
        window?.styleMask.remove(.titled)
        window?.setFrame(NSScreen.screens[0].frame, display: true, animate: false)
        
    }

您需要在设置框架之前删除窗口标题栏,因为标题栏存在直到您隐藏它。此外,您可能不需要自动隐藏工具栏。

我会用 替换您的演示选项window?.level = .mainMenu + 1,然后您不必隐藏菜单栏和所有这些东西,但您不必这样做。


推荐阅读