SwiftUI 内置的 MenuBarExtra
API 可以轻松地用纯 SwiftUI 创建菜单栏应用程序。但是,当前的 WindowMenuBarExtraStyle
实现存在局限性,因为它在关闭时不会像传统菜单项那样淡出,菜单打开时不会保持选择状态,并且使用的调整大小机制不够理想,这会让您的应用程序感觉不够完善。
FluidMenuBarExtra 是一个轻量级软件包,它提供了一个方便的 API,用于在 AppKit 和 SwiftUI 应用程序中使用 SwiftUI 创建无缝的菜单栏附加组件。一旦 MenuBarExtra 在 macOS 的未来版本中得到改进,切换回 MenuBarExtra 就像将几行 SwiftUI 代码移回您的 App
一样简单。
scenePhase
环境变量访问菜单的场景阶段。要使用 FluidMenuBarExtra,请在应用程序的生命周期内初始化一次 FluidMenuBarExtra
。如果需要多个菜单栏附加组件,则可以存在多个 FluidMenuBarExtra
实例。
首先,定义一个应用程序委托。不用担心,您应用程序的入口点仍然基于 SwiftUI。
class AppDelegate: NSObject, NSApplicationDelegate {
private var menuBarExtra: FluidMenuBarExtra?
func applicationDidFinishLaunching(_ notification: Notification) {
self.menuBarExtra = FluidMenuBarExtra(title: "My Menu", systemImage: "cloud.fill") {
Text("My SwiftUI View")
}
}
}
然后,使用 @NSApplicationDelegateAdaptor
属性包装器将委托附加到您的 SwiftUI 应用程序
import SwiftUI
@main
struct MyApplication: App {
@NSApplicationDelegateAdaptor private var appDelegate: AppDelegate
var body: some Scene {
Settings {
SettingsTabs()
}
}
}
就是这样!只要 FluidMenuBarExtra
的引用存在,菜单栏附加组件就会被安装。当引用被删除或设置为 nil
时,该项将从菜单栏中删除。
💡 提示: 如果需要在菜单栏附加组件和其他窗口之间共享任何有状态的属性或实用程序,可以将这些属性移动到您的
AppDelegate
。要允许 SwiftUI 视图使用已发布的属性,请使委托类符合ObservableObject
。然后,SwiftUI 将自动将委托插入到环境中。了解更多。
Scene
。由于 FluidMenuBarExtra 不是在场景中创建的,因此您需要在 App
的主体中至少有一个其他场景。EmptyView()
的 Settings
场景。_EmptyScene()
,但不保证 App Review 会喜欢它。NSWindow
而不是 NSMenu
,您会发现 FluidMenuBarExtra 显示的窗口的圆角半径比其他菜单略宽。欢迎所有贡献。如果您需要这种软件包,请随时解决任何问题并添加任何可能有用的功能。
除非另有说明,否则 FluidMenuBarExtra 是在 MIT 许可证 下发布的。