swift - 如何显示然后隐藏占据全屏的覆盖窗口

标签 swift macos cocoa window

所以我试图在整个屏幕(甚至停靠栏和菜单栏)上显示一个窗口叠加层以捕获所有输入事件,并在定时器定义的 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/

相关文章:

ios - AudioKit - 在启动时删除 AKNodeOutputPlot 中心线

objective-c - Objective-C 中的矩阵乘法

objective-c - 将 PDF 文档的创建从 iOS 移植到 Mac OS X

php - 默认 php.ini macOs Catalina

macos - 如何在 mac os x 中设置默认的 ant 路径?

objective-c - Cocoa:假设传递 NSFilesPromisePboardType 的目标 URL 是文件 URL 是否安全?

ios - 如何以编程方式获取 iOS 信任的证书列表?

swift - 逗号分隔的条件和使用双符号的条件有什么区别

android - Android 版 Swift : `ld` cannot find `-lgcc` in swift for android compilation linking step

macos - 将按键发送到 Mac 上的特定窗口