i可以在Swiftui应用中访问窗口coclusionState?

问题描述 投票:0回答:1
注:这个问题指的是macos,与iOS无关。
Context

MYMAC应用程序具有“日志”窗口,该窗口将在应用程序的各个部分需要向用户呈现错误或警告时出现。在Swiftui中,缩写结构看起来像这样:

@main struct SomeApp: App { @Environment(\.openWindow) private var openWindow @State private var appController = AppController() var body: some Scene { Window("SomeApp", id: SomeApp.mainWindowIdentifier) { MainWindowRootView() .environment(appController) } Window("Log", id: SomeApp.logWindowIdentifier) { LogWindowRootView() } } }
问题

我知道我可以使用

openWindow(id:)

打开日志窗口。但是我想要的是我在appkit中拥有的东西:

NSWindowController
确保如果日志窗口已经部分可见(即用户将其放在屏幕上的其他一些窗口后面,但至少可以看到一部分),那么它不会跳到前面并窃取焦点。这是一个很小的细节,但它使该应用程序成为Macos的更愉快的公民。
在纯Swiftui中有类似的方法可以实现这一目标吗?我希望只有在完全遮住的情况下才能打开(成为键)。

遵循与AppKit中相同的行为可能有点棘手

,但是,我们可以尝试创建一个自定义

if showWindow && !(window?.occlusionState.contains(.visible) ?? false) { self.showWindow(self) }

来管理日志窗口。

NSWindowController
swift swiftui swiftui-windowgroup
1个回答
0
投票
现在,我们可以创建一个swiftui视图来触发窗口控制器

NSWindowController

与Swiftui应用结构集成:

import Cocoa
class LogWindowController: NSWindowController {
    static let shared = LogWindowController(windowNibName: "LogWindow")

    func showIfNeeded() {
        if let window = self.window, !window.occlusionState.contains(.visible) {
            self.showWindow(nil)
        }
    }
}

至少,您可以控制日志窗口的可见性,而不会窃取焦点,如果它已经部分可见。
,这只是一项工作,这可能不是完全合适的。希望它有帮助
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.