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

时间:2016-11-04 09:01:32

标签: objective-c macos cocoa swift3 fullscreen

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

我真的不明白为什么这么难,但我已经尝试了几乎所有我能想到的东西,包括我在任何答案中找到的关于移动窗户或全屏幕的所有内容。

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

E.g。

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

可能会或可能不会将窗口移动到第二个屏幕。如果我设置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])
    }

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

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

1 个答案:

答案 0 :(得分:2)

仅使用setFrameOrigin对我有用,例如:

if let screen = NSScreen.screens()?[1] {
     window.setFrameOrigin(screen.visibleFrame.origin)
}    

价: 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))
    }