二级监视器上的全屏NSWindow - Swift

时间:2015-03-05 18:05:11

标签: xcode swift fullscreen

我在Obj C上看过很多帖子。在swift中没有太多的帖子,我只是无法让它工作。我希望能够在特定的NSScreen上制作全屏窗口。 'ToggleFullscreen'方法不是最好的方法,因为没有很多选项(对于外部显示)。我试过了:

    // screen is my variable already set
    outputWindow!.window!.setFrame(screen.frame, display: true, animate: true)
    outputWindow!.window!.styleMask = NSFullScreenWindowMask
    outputWindow!.window!.level = Int(CGShieldingWindowLevel())

    // the above one doesn't make it fullscreen.
    // it has a title bar and shows the menu on the screen. 



    // then i tried....
    fullscreenWindow = NSWindow(contentRect: screen.frame, styleMask:NSBorderlessWindowMask, backing: NSBackingStoreType.Buffered, defer: false, screen: screen)
    fullscreenWindow.level = Int(CGShieldingWindowLevel())
    fullscreenWindow.makeKeyAndOrderFront(nil)

    //that one works on my main display (somewhat). and does nothing on externals. 

我在制作自己的全屏时注意到的一件事是我陷入其中。它不像OS X全屏,你可以按esc来逃避它。这有什么窍门吗?感谢

2 个答案:

答案 0 :(得分:1)

我也在努力陷入全屏困境。这背后的原因是使用NSBorderlessWindowMask可以防止窗口成为密钥,无论向其发送makeKeyAndOrderFront:makeKeyWindow消息。在Objective-C中,解决方案是在子类canBecomeKeyWindow中实现NSWindow

- (BOOL)canBecomeKeyWindow {
     return YES;
}

现在它也会在全屏显示后收到关键事件。

答案 1 :(得分:0)

这是一个伪答案:

[在NSWondowController的继承类中]

var fullscreen:Bool {
    set {
        if newValue == true {

            if fullscreen == true {
                return
            }

            frameOrig = self.window?.frame
            self.window?.setFrame((NSScreen.main()?.frame)!, display: true)
        }
        else {
            self.window?.setFrame(frameOrig!, display: true)
        }
    }
    get {
        return self.window?.frame == NSScreen.main()?.frame
    }
}

我还在调用窗口和全屏窗口上捕获了键事件,并将它们指向上面的函数,以便可以切换。像这样:

[在某些viewcontroller中]:

override func keyUp(with event: NSEvent) {
    switch event.keyCode {
    case 53:
        debugPrint("ESC - randomviewcontroller")
        (randomView.window?.windowController as! RandomWindowController).fullscreen = !(RandomView.window?.windowController as! RandomWindowController).fullscreen;
        break
    default:
        super.keyUp(with: event)
    }
}

我认为以上可以做得更好更好更聪明......(一个月前接过斯威夫特......)但俗话说:"它在我的电脑上工作了!"

希望它有所帮助。