Extras de la barre de menus dans SwiftUI pur
La création d’extras de barre de menus pour les applications Swift UI était une tâche plutôt fastidieuse car il n’y avait pas de solution SwiftUI native à ce problème. Au lieu de cela, le MenuBarExtra
devait être mis en œuvre dans AppKit
nécessitant une AppDelegate
dossier.
Avec macOS 13 Ventura, cependant, Apple fournit enfin un moyen de faire MenuBarExtras
la manière SwiftUI. Il a été introduit pour la première fois dans le WWDC Talk « Apportez plusieurs fenêtres à votre application SwiftUI » et fait de l’écriture d’applications utilitaires dans Swift UI une promenade dans le parc.
Plutôt que de jouer avec AppKit, MenuBarExtras
peuvent maintenant être directement ajoutés au corps de votre application à côté de votre Windows
ou alors WindowGroups
.
@main
struct UtilityApp: App {
var body: some Scene {
MenuBarExtra("UtilityApp", systemImage: "hammer") { ... }WindowGroup{ ... }
}
}
MenuBarExtras
prennent le plus souvent trois paramètres :
TitleKey
: Une chaîne qui l’identifie. Très probablement le nom de votre applicationImage
: Le symbole affiché dans la barre de menus. De préférence, unSFSymbol
. De cette façon, vous obtenez le comportement de thème clair et sombre prêt à l’emploi.Content
: Cela peut être pratiquement n’importe quoi. Cela dépend du style choisi, comment il est rendu, cependant.
Il existe deux styles prédéfinis pour MenuBarExtras
:
Le plus facile des deux est .menu
. C’est le style par défaut et rend le contenu de votre barre de menus supplémentaire sous la forme d’un menu standard.
@main
struct UtilityApp: App {
var body: some Scene {
MenuBarExtra("UtilityApp", systemImage: "hammer") {
AppMenu()
}WindowGroup{...}
}
}
Voici un exemple de ce à quoi ressemble la vue du menu de l’application de la capture d’écran ci-dessus. Veuillez noter que tous les types de vues ne seront pas rendus comme vous pourriez vous y attendre dans le style de menu.
Par exemple, les styles de boutons seront ignorés pour s’adapter au style général des menus macOS. Les vues comme les images seront complètement ignorées. Ce style est principalement limité au texte, aux boutons et aux séparateurs, mais est pratique pour les applications qui ne nécessitent pas d’interface utilisateur riche.
struct AppMenu: View {
func action1() {...}
func action2() {...}
func action3() {...}var body: some View {
Button(action: action1, label: { Text("Action 1") })
Button(action: action2, label: { Text("Action 2") })
Divider()
Button(action: action3, label: { Text("Action 3") })
}
}
Le style de fenêtre vous permet de rendre n’importe quel type de contenu dans le MenuBarExtra
et peut être utilisé pour les applications nécessitant davantage de contrôles personnalisés, tels que des curseurs ou des commutateurs.
Afin d’activer le style de fenêtre, ajoutez le .menuBarExtraStyle
modificateur à la MenuBarExtra
et réglez-le sur .window
.
@main
struct UtilityApp: App {
var body: some Scene {
MenuBarExtra("UtilityApp", systemImage: "hammer") {
AppMenu()
}.menuBarExtraStyle(.window)WindowGroup{...}
}
}
Si votre application se compose uniquement d’un MenuBarExtra
et aucune fenêtre supplémentaire n’est nécessaire, vous êtes libre de supprimer le WindowGroup
totalement. Dans ces cas, vous ne voulez probablement pas non plus que votre application apparaisse dans le dock.
Cela peut facilement être réalisé en faisant de votre application une application d’agent en définissant l’application est un agent (UIElement
) sur OUI dans votre application info.plist
. Applications d’agent ne s’affiche pas dans le Dock de l’utilisateur.