首页 > 解决方案 > 在连接的显示器上打开 NSWIndow / NSView

问题描述

环境: macOS Big Sur 11.5.2 / Swift 5.4
目标平台: macOS

我在搜索如何在连接的显示器上打开新的 NSWindow / NSView 时遇到了这个讨论。

我将 obj-c 代码转换为 Swift,但我无法让它工作。我在 IBAction 中设置了该方法,并将该操作链接到放置在标题为“显示外部显示器”的视图中的按钮。

我究竟做错了什么?

import Cocoa

class ViewController: NSViewController {

    var externalDisplay: NSScreen?
    var fullScreenWindow: NSWindow?
    var fullScreenView: NSView?
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }

    @IBAction func showExternalDisplayButtonClicked(sender: Any?) {
        // Open a window on the external display if present
        if NSScreen.screens.count > 1 {
            externalDisplay = NSScreen.screens.last
            let externalDisplayRect = externalDisplay!.frame
            fullScreenWindow = NSWindow(contentRect: externalDisplayRect, styleMask: .borderless, backing: .buffered, defer: true, screen: externalDisplay)
            fullScreenWindow!.level = .normal
            fullScreenWindow!.isOpaque = false
            fullScreenWindow!.hidesOnDeactivate = false
            fullScreenWindow!.backgroundColor = .red
            let viewRect = NSRect(x: 0, y: 0, width: externalDisplay!.frame.width, height: externalDisplay!.frame.height)
            fullScreenView = NSView(frame: viewRect)
            fullScreenWindow!.contentView = fullScreenView
            fullScreenWindow!.makeKeyAndOrderFront(self)
        }
    }

}

标签: swiftmacosnswindowexternal-display

解决方案


你为什么做styleMask: .borderless?文档说无边框窗口不能成为关键或主要窗口,因此makeKeyAndOrderFront失败。

如果你制作一个像这样的普通窗口:

let mask: NSWindow.StyleMask = [.titled, .closable, .miniaturizable, .resizable]
fullScreenWindow = NSWindow(contentRect: externalDisplayRect, styleMask: mask, backing: .buffered, defer: true, screen: externalDisplay)

它在最后一个屏幕上打开。


推荐阅读