如何以编程方式将 NSWindow 移动到 MacOS Sierra 中的另一个屏幕

tom*_*son 4 macos cocoa objective-c fullscreen swift3

我正在尝试制作一个在第二台显示器上启动、播放视频然后退出的全屏视频播放器。

我真的不明白为什么这这么难,但我已经尝试了几乎所有我能想到的方法,包括我在任何答案中找到的与移动窗口或使它们全屏有关的所有内容。

1)将窗口框架设置为第二个屏幕的框架并不能可靠地移动它。

例如

    if let screen = NSScreen.screens()?[1] {
        let frame = screen.frame
        window.setFrame(frame, display: true, animate: true)
    }
Run Code Online (Sandbox Code Playgroud)

可能会也可能不会将窗口移动到第二个屏幕。如果我设置 animate: false,它永远不会。

2)做 self.view.enterFullScreenMode(secondScreen, withOptions: options) 不起作用我最终在主屏幕上有一个奇怪的浮动窗口。如果我在主屏幕上进入 fullScreenMode,它将完美地全屏显示。

    if let screen = NSScreen.screens()?[1] {

        let presOptions:NSApplicationPresentationOptions = [
            .fullScreen,
            .hideDock,
            .hideMenuBar,
            .autoHideToolbar
        ]

        self.view.enterFullScreenMode(screen, withOptions: [NSFullScreenModeApplicationPresentationOptions: presOptions,
                                                            NSFullScreenModeAllScreens: false])
    }
Run Code Online (Sandbox Code Playgroud)

有谁知道我到底做错了什么?

我还在 applicationDidFinishLaunching 中尝试了 window.toggleFullScreen(nil) - 这似乎可以在我的一台计算机上运行,​​但在另一台计算机上它在另一个空间中运行该应用程序,但从未将该空间设置为可见。

小智 5

它只适用于我使用 setFrameOrigin 例如:

if let screen = NSScreen.screens()?[1] {
     window.setFrameOrigin(screen.visibleFrame.origin)
}    
Run Code Online (Sandbox Code Playgroud)

参考:https : //developer.apple.com/documentation/appkit/nsview/1483283-setframeorigin


关于全屏模式下的设置窗口。如果您是从视图中执行此操作(如我所想),则可以尝试以下操作:

override func viewDidAppear() {
        super.viewDidAppear()
        self.view.window?.styleMask.insert(.fullScreen)
        self.view.window?.styleMask.insert(.fullSizeContentView)
        self.view.window?.level = Int(CGWindowLevelForKey(.maximumWindow))
    }
Run Code Online (Sandbox Code Playgroud)