2017-09-23 30 views
1

所以我试图表现出在整个画面窗口的叠加(甚至在对接和菜单栏)捕获所有输入事件叠加窗口,并经过定时器定义x秒,隐藏。我知道这是可能的,因为AppStore中有一个应用程序正在执行此操作。如何显示,然后隐藏占据全屏

我找到了两种方法:一是 :

let windowLevel = CGShieldingWindowLevel(); 
let windowRect = NSScreen.main?.frame 
var overlayWindow = NSWindow(contentRect: windowRect!, styleMask: NSWindow.StyleMask.borderless, backing: NSWindow.BackingStoreType.buffered, defer: false, screen: NSScreen.screens[0]) 

overlayWindow.level = NSWindow.Level(rawValue: NSWindow.Level.RawValue(windowLevel)) 
overlayWindow.backgroundColor = .black 
overlayWindow.alphaValue = 0.4 
overlayWindow.makeKeyAndOrderFront(nil) 
overlayWindow.makeMain() 

二: 用故事板

let window = FullScreenWindowController(windowNibName: NSNib.Name(rawValue: "FullScreenWindow")) 
self.application.runModal(for: self.window.window!) 

第一个解决方案将导致该日志显示:

Assertion failure in -[NSWindow _changeJustMain], /Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-1504.83.101/AppKit.subproj/NSWindow.m:14861 
Invalid parameter not satisfying: [self canBecomeMainWindow] 

而且我也无法运行模式时的定时器被呈现。模态阻止所有事件并且定时器循环不能发生。 我看到了一些使用NSRunner looper的方法......但我不确定在当前的SDK版本中这仍然是可行的。

至于第二溶液,我不能恢复初始状态的应用程序,我的意思是隐藏覆盖表示它之后。 该解决方案的另一个缺点是码头仍然可见并且可以进行交互。因为我很新的MacOS开发

希望得到一些建议。

回答

1

得到它通过窗口电平设置为CGShieldingWindowLevel()在第二种方法解决。 不知道但如果这是正确的(苹果许可证),并可以使用(文档说应该)...

相关问题