所以我试图在整个屏幕(甚至停靠栏和菜单栏)上显示一个窗口叠加层以捕获所有输入事件,并在定时器定义的 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()
第二个: 使用 Storyboard
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 开发人员的新手。
最佳答案
通过在第二种方法中将窗口级别设置为 CGShieldingWindowLevel() 解决了这个问题。 不确定这是否正确(Apple 允许)并且可以使用(文档说不应该)...
关于swift - 如何显示然后隐藏占据全屏的覆盖窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46382798/