使用SwiftUI更改macOS窗口级别(以创建浮动窗口)

ctzwtxfj  于 2023-09-29  发布在  Swift
关注(0)|答案(2)|浏览(150)

嗨,有没有办法用SwiftUI改变window level,这样我就可以为我的Mac应用程序创建一个浮动窗口?我正在使用SwiftUI生命周期

bqjvbblv

bqjvbblv1#

您可以使用NSApplication.shared.windows访问您的窗口,并为每个窗口设置level
例如:

Button("Float windows") {
    for window in NSApplication.shared.windows {
        window.level = .floating
    }
}
juzqafwq

juzqafwq2#

你可以像 Alexandria Sandberg那样使用window.level = .floating,但你可能只想为应用程序中的一个窗口指定这个值,而不是每个窗口。
也就是说,看看Asperi的帖子,它向您展示了如何在SwiftUI中访问macOS中的窗口:https://stackoverflow.com/a/63439982/10844710
我将在这里总结相关代码:

#if os(macOS)
import SwiftUI
import AppKit

struct WindowAccessor: NSViewRepresentable {
    @Binding var window: NSWindow?

    func makeNSView(context: Context) -> NSView {
        let view = NSView()
        DispatchQueue.main.async {
            self.window = view.window
        }
        return view
    }

    func updateNSView(_ nsView: NSView, context: Context) {}
}
#endif

然后,您可以在应用顶层的窗口组中使用它,如下所示:

ContentView().background(WindowAccessor(window: $window)).onChange(of: window) { newWindow in
    if windowFloats {
        newWindow?.level = .floating
    } else {
        newWindow?.level = .normal
    }
}.onChange(of: windowFloats) { floats in
    if windowFloats {
        window?.level = .floating
    } else {
        window?.level = .normal
    }
}

您可以根据需要包含变量:

#if os(macOS)
@State var window: NSWindow?
@AppStorage("windowFloats") private var windowFloats: Bool = false
#endif

相关问题