我在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来逃避它。这有什么窍门吗?感谢
答案 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)
}
}
我认为以上可以做得更好更好更聪明......(一个月前接过斯威夫特......)但俗话说:"它在我的电脑上工作了!"
希望它有所帮助。