2017-09-23 31 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()在第二種方法解決。 不知道但如果這是正確的(蘋果許可證),並可以使用(文檔說應該)...

相關問題