swiftUI笔记之MenuBarExtra实践(mac应用)

4VO1By

背景

最近在推进我的一款mac应用产品,需使用到menuBar,以前都使用swift appDelegate,现在使用新的MenuBarExtras验证下。

实践

在 macOS 13 Ventura 中,Apple 终于提供了一种实现MenuBarExtras SwiftUI 方式的方法。它首次在 WWDC 演讲“为您的 SwiftUI 应用程序带来多个窗口”中引入,并使在 Swift UI 中编写实用程序应用程序变得轻而易举。

现在MenuBarExtras可以直接将您的应用程序主体与您的Windows或WindowGroups.

1
2
3
4
5
6
7
8
9
@main 
struct UtilityApp : App {
var body: some Scene {
MenuBarExtra ( "UtilityApp" , systemImage: "hammer" ) { ... }

WindowGroup { ... }
}
}

MenuBarExtras大多数时候采用三个参数:

TitleKey: 标识它的字符串。很可能是您的应用程序的名称
Image:菜单栏中显示的符号。最好是,一个SFSymbol。通过这种方式,您可以开箱即用地获得浅色和深色主题行为。
Content: 这几乎可以是任何东西。不过,这取决于所选样式的呈现方式。
有两种预定义样式MenuBarExtras

菜单

两者中较容易的是.menu。它是默认样式,将 Menu Bar Extra 的内容呈现为标准菜单。
62CM3J

1
2
3
4
5
6
7
8
9
10
@main 
struct UtilityApp : App {
var body: some Scene {
MenuBarExtra ( "UtilityApp" , systemImage: "hammer" ) {
AppMenu ()
}

WindowGroup { ... }
}
}

当然你也可以显性的使用 .menuBarExtraStyle(.menu)

窗户

窗口样式允许您将任何类型的内容呈现到的MenuBarExtra弹出窗口中,并且可用于需要更多自定义控件(如滑块或开关)的应用程序。
oZjjne

为了启用窗口样式,将.menuBarExtraStyle修饰符添加到MenuBarExtra并将其设置为.window。

1
2
3
4
5
6
7
8
9
10
@main 
struct UtilityApp : App {
var body: some Scene {
MenuBarExtra ( "UtilityApp" , systemImage: "hammer" ) {
AppMenu ()
}.menuBarExtraStyle(.window)

WindowGroup { ... }
}
}

从 Dock 隐藏应用程序

如果您的应用仅包含一个MenuBarExtra并且不需要额外的窗口,您可以WindowGroup完全删除该窗口。在这些情况下,您很可能也不希望您的应用出现在 Dock 中。

这可以通过UIElement在您的应用程序的info.plist. 代理应用程序不会出现在用户的 Dock 中
OOXQjc