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開發
希望得到一些建議。