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

Posted

技术标签:

【中文标题】如何在 SwiftUI 生命周期中删除 macOS 中的最大化、最小化和关闭按钮?【英文标题】:How can I remove maximize, minimize and close button in macOS in SwiftUI-life cycle? 【发布时间】:2021-03-31 13:37:39 【问题描述】:

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



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

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

【问题讨论】:

请谨慎使用。 我要求防止可能的 XY 问题。有时人们问这些问题并不是因为他们出于某种原因想要隐藏这些按钮,而是因为他们实际上想要实现一些自然没有它们的东西。例如,启动屏幕或确认弹出窗口。在这种情况下,他们应该询问如何实现该东西,而不是如何解决在尝试复制它时出现的问题。 丑陋的黑客,var body: some View VStack .sheet(isPresented: .constant(true)) Text("This is a window ????").frame(width: 400, height: 400) 【参考方案1】:

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

无论如何,诀窍是抓住持有 SwiftUI 视图的窗口,然后对其进行调整。对于有问题的应用程序。

在 helloWorld 程序中使用 mainWindow 的示例...

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
            )
    

备注

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

    我见过的另一种获取窗口的方法是向使用 AppKit 创建它的 UI 添加一个虚拟的“查找我的窗口”类型视图,并在它这样做时获取对窗口的引用。在LostMoa's blog here 上有一个很好的说明这种方法。

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

【讨论】:

感谢您的宝贵时间,我知道这样,我的目标是纯 SwiftUI。 @swiftPunk - 问题询问“SwiftUI 生命周期中的 macOS”,这在该生命周期中有效。就在 SwiftUI 中避免 AppKit 而言,Apple 的 WWDC21 休息室在回答有关打开新 macOS 窗口的问题时记录的台词是“我们在这方面没有太多 API”(请参阅​​ roblack.github.io/WWDC21Lounges )——如果没有的话,那么任何其他更复杂的特定于 macOS 的 UI 似乎都不太可能。 Fwiw,这符合我迄今为止的经验,即我不相信当前没有 AppKit 可以实现请求的窗口自定义。 @swiftPunk - 造成混淆是因为 SwiftUI 应用程序生命周期是 Apple 用来描述当前 SwiftUI 实例化应用程序方法的术语。它是在 2020 年引入的,作为原始 AppDelegate 方法的替代品,例如参见peterfriese.dev/posts/…、medium.com/swlh/…。 fwiw 同意 SwiftUI;不幸的是,在 macOS 上,这个未来比现在在 ios 上要远一些:-/ .. 无论如何,祝你好运。

以上是关于如何在 SwiftUI 生命周期中删除 macOS 中的最大化、最小化和关闭按钮?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如何在 macOS 应用程序中实现编辑菜单

如何在 SwiftUI 应用生命周期中更改状态栏样式?

如何在 Xcode 12 的新 SwiftUI App 生命周期中更改 window.rootViewController?

如何响应 SwiftUI 中的视图生命周期事件?

如何在 SwiftUI 中激活/停用菜单项

如何在 SwiftUI 应用程序生命周期中更改特定视图的状态栏颜色?