如何在 SwiftUI 生命周期中删除 macOS 中的最大化、最小化和关闭按钮?

use*_*ser 12 macos swift swiftui

我正在开发一个项目,用于删除最大化、最小化和关闭按钮,我们可以在SwiftUI 生命周期中使用 Xcode for macOS构建的每个应用程序/项目的每个窗口中看到这些按钮。我怎么能这样做呢?


在此输入图像描述


PS:请考虑我正在SwiftUI 生命周期/macOS上进行编码,如果您的代码或方式与其不兼容,那么我将无法使用它。感谢您的帮助和您的时间。

更新,日期 2022 年 3 月 5 日: 问题仍然悬而未决,正在寻找 SwiftUI 方法。您可以使用 SwiftUI api 来回答这个问题。

shu*_*ngb 11

当我自己想做类似的事情时遇到了这个问题,所以我想我应该为后代添加答案 - 或者至少在苹果决定让 SwiftUI 在 macOS 上很好地工作之前。

不管怎样,诀窍是获取保存 SwiftUI 视图的窗口,然后对其进行调整。最简单的方法似乎是监听 的NSApplicationdidBecomeActiveNotification然后从 中获取参考NSApplication.shared mainWindowkeyWindow(或者可能通过标题将其过滤掉windows),因为最适合相关应用程序。

mainWindow用于helloWorld 程序的示例...

struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .padding()
            .frame(minWidth: 200, minHeight: 200)
            .navigationTitle("Undecorated")
            .onReceive(NotificationCenter.default.publisher(for: NSApplication.didBecomeActiveNotification), perform: { _ in
                NSApp.mainWindow?.standardWindowButton(.zoomButton)?.isHidden = true
                NSApp.mainWindow?.standardWindowButton(.closeButton)?.isHidden = true
                NSApp.mainWindow?.standardWindowButton(.miniaturizeButton)?.isHidden = true
            })
    }
}
Run Code Online (Sandbox Code Playgroud)

笔记

  1. 尽管按钮已从窗口中消失,但值得注意的是,用于最大化、隐藏和终止窗口的菜单项和热键仍然完全可用。该功能必须与自定义窗口外观分开删除。

  2. 我见过的获取窗口的替代方法是向使用 AppKit 创建窗口的 UI 添加一个虚拟的“查找我的窗口”类型视图,并在执行此操作时获取对窗口的引用。LostMoa 的博客上对这种方法进行了很好的阐述。

  3. 如果有人发现更好的东西,我会非常感兴趣。